From e22449961a8476232f1a698baba9f81169d93ef5 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Fri, 22 Aug 2025 19:48:58 +0000 Subject: [PATCH 1/3] feat: Add env var to log server errors --- .../adapter/DriverConnectionHandler.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java b/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java index 1ae9f9a1..2d2e7a64 100644 --- a/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java +++ b/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java @@ -29,6 +29,7 @@ import com.datastax.oss.protocol.internal.request.Batch; import com.datastax.oss.protocol.internal.request.Execute; import com.datastax.oss.protocol.internal.request.Query; +import com.datastax.oss.protocol.internal.response.Error; import com.google.api.gax.grpc.GrpcCallContext; import com.google.api.gax.rpc.ApiCallContext; import com.google.cloud.spanner.adapter.metrics.BuiltInMetricsRecorder; @@ -66,6 +67,8 @@ final class DriverConnectionHandler implements Runnable { private static final ByteBufAllocator byteBufAllocator = ByteBufAllocator.DEFAULT; private static final FrameCodec serverFrameCodec = FrameCodec.defaultServer(new ByteBufPrimitiveCodec(byteBufAllocator), Compressor.none()); + private static final FrameCodec clientFrameCodec = + FrameCodec.defaultClient(new ByteBufPrimitiveCodec(byteBufAllocator), Compressor.none()); private final Socket socket; private final AdapterClientWrapper adapterClientWrapper; private final Optional maxCommitDelayMillis; @@ -79,6 +82,8 @@ final class DriverConnectionHandler implements Runnable { private static final GrpcCallContext DEFAULT_CONTEXT_WITH_LAR = GrpcCallContext.createDefault().withExtraHeaders(ROUTE_TO_LEADER_HEADER_MAP); private static final byte[] EMPTY_BYTES = new byte[0]; + private static final boolean LOG_SERVER_ERROR = + Boolean.parseBoolean(System.getenv("GOOGLE_SPANNER_LOG_SERVER_ERROR")); /** * Constructor for DriverConnectionHandler. @@ -164,7 +169,13 @@ private void processRequestsLoop(InputStream inputStream, OutputStream outputStr prepareResult.getAttachments(), prepareResult.getContext(), streamId); - // Now response holds the gRPC result, which might still be empty. + if (LOG_SERVER_ERROR) { + Frame frame = decodeClientFrame(response.toByteArray()); + if (frame.message instanceof Error) { + Error error = (Error) frame.message; + LOG.info("ERROR: code: {}, message: {}", error.code, error.message); + } + } } } catch (RuntimeException e) { // 5. Handle any error during payload construction or attachment processing. @@ -288,6 +299,13 @@ private Frame decodeFrame(byte[] payload) { return frame; } + private Frame decodeClientFrame(byte[] payload) { + ByteBuf payloadBuf = Unpooled.wrappedBuffer(payload); + Frame frame = clientFrameCodec.decode(payloadBuf); + payloadBuf.release(); + return frame; + } + /** * Attempts to prepare the given payload prior to sending the request. * From 5b99c91d024fc4d66b9a004b7b9ee9468f260c9e Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Sat, 23 Aug 2025 02:30:30 +0000 Subject: [PATCH 2/3] fix comments --- .../cloud/spanner/adapter/DriverConnectionHandler.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java b/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java index 2d2e7a64..0cf28fde 100644 --- a/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java +++ b/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java @@ -82,8 +82,10 @@ final class DriverConnectionHandler implements Runnable { private static final GrpcCallContext DEFAULT_CONTEXT_WITH_LAR = GrpcCallContext.createDefault().withExtraHeaders(ROUTE_TO_LEADER_HEADER_MAP); private static final byte[] EMPTY_BYTES = new byte[0]; - private static final boolean LOG_SERVER_ERROR = - Boolean.parseBoolean(System.getenv("GOOGLE_SPANNER_LOG_SERVER_ERROR")); + private static final String ENV_VAR_GOOGLE_SPANNER_CASSANDRA_LOG_SERVER_ERRORS = + "GOOGLE_SPANNER_CASSANDRA_LOG_SERVER_ERRORS"; + private static final boolean LOG_SERVER_ERRORS = + Boolean.parseBoolean(System.getenv(ENV_VAR_GOOGLE_SPANNER_CASSANDRA_LOG_SERVER_ERRORS)); /** * Constructor for DriverConnectionHandler. @@ -169,7 +171,7 @@ private void processRequestsLoop(InputStream inputStream, OutputStream outputStr prepareResult.getAttachments(), prepareResult.getContext(), streamId); - if (LOG_SERVER_ERROR) { + if (LOG_SERVER_ERRORS) { Frame frame = decodeClientFrame(response.toByteArray()); if (frame.message instanceof Error) { Error error = (Error) frame.message; From 5dee0ee4c6a245f4271704db5fffe934a709e586 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Mon, 25 Aug 2025 05:27:16 +0000 Subject: [PATCH 3/3] fix comment --- .../google/cloud/spanner/adapter/DriverConnectionHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java b/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java index 0cf28fde..ad9df5cf 100644 --- a/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java +++ b/google-cloud-spanner-cassandra/src/main/java/com/google/cloud/spanner/adapter/DriverConnectionHandler.java @@ -85,7 +85,9 @@ final class DriverConnectionHandler implements Runnable { private static final String ENV_VAR_GOOGLE_SPANNER_CASSANDRA_LOG_SERVER_ERRORS = "GOOGLE_SPANNER_CASSANDRA_LOG_SERVER_ERRORS"; private static final boolean LOG_SERVER_ERRORS = - Boolean.parseBoolean(System.getenv(ENV_VAR_GOOGLE_SPANNER_CASSANDRA_LOG_SERVER_ERRORS)); + Boolean.parseBoolean( + System.getenv() + .getOrDefault(ENV_VAR_GOOGLE_SPANNER_CASSANDRA_LOG_SERVER_ERRORS, "false")); /** * Constructor for DriverConnectionHandler.