truncate-JSON-logs.patch.txt

text/plain

Filename: truncate-JSON-logs.patch.txt
Type: text/plain
Part: 0
Message: Re: reduce size of logs stored by buildfarm
From 7f6b1b4d19ac19f62dc5525198bb3d047d21ae7e Mon Sep 17 00:00:00 2001
From: Jacob Champion <jacob.champion@enterprisedb.com>
Date: Tue, 25 Nov 2025 10:07:29 -0800
Subject: [PATCH] WIP: truncate long JSON responses in logs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Reported-by: Álvaro Herrera <alvherre@kurilemu.de>
Discussion: https://postgr.es/m/202511251218.zfs4nu2qnh2m%40alvherre.pgsql
---
 .../modules/oauth_validator/t/oauth_server.py | 22 ++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/test/modules/oauth_validator/t/oauth_server.py b/src/test/modules/oauth_validator/t/oauth_server.py
index 0f8836aadf3..c70783ecbe4 100755
--- a/src/test/modules/oauth_validator/t/oauth_server.py
+++ b/src/test/modules/oauth_validator/t/oauth_server.py
@@ -257,13 +257,33 @@ class OAuthHandler(http.server.BaseHTTPRequestHandler):
 
         return token
 
+    def _log_response(self, js: JsonObject) -> None:
+        """
+        Trims the response JSON, if necessary, and logs it for later debugging.
+        """
+        # At the moment the biggest problem for tests is the _pad_ member, which
+        # is a megabyte in size, so truncate that to something more reasonable.
+        if "_pad_" in js:
+            pad = js["_pad_"]
+
+            # Don't modify the original dict.
+            js = dict(js)
+            js["_pad_"] = pad[:64] + f"[...truncated from {len(pad)} bytes]"
+
+        resp = json.dumps(js).encode("ascii")
+        self.log_message("sending JSON response: %s", resp)
+
+        # If you've tripped this assertion, please truncate the new addition as
+        # above, or else come up with a new strategy.
+        assert len(resp) < 1024, "_log_response must be adjusted for new JSON"
+
     def _send_json(self, js: JsonObject) -> None:
         """
         Sends the provided JSON dict as an application/json response.
         self._response_code can be modified to send JSON error responses.
         """
         resp = json.dumps(js).encode("ascii")
-        self.log_message("sending JSON response: %s", resp)
+        self._log_response(js)
 
         self.send_response(self._response_code)
         self.send_header("Content-Type", self._content_type)
-- 
2.34.1