Details
-
Bug
-
Status: Resolved
-
Normal
-
Resolution: Fixed
-
None
-
Normal
Description
This has been reported independently with the Java and C++ drivers.
This happens under heavy load, where multiple client threads prepare and execute statements in parallel. One of them sends an EXECUTE request with skipMetadata=false, but the returned ROWS response has no metadata in it.
A patch of Message.Dispatcher.channelRead0 confirmed that the flag was incorrectly set on the response:
logger.debug("Received: {}, v={}", request, connection.getVersion()); boolean skipMetadataOnRequest = false; if (request instanceof ExecuteMessage) { ExecuteMessage execute = (ExecuteMessage)request; skipMetadataOnRequest = execute.options.skipMetadata(); } response = request.execute(qstate); if (request instanceof ExecuteMessage) { Rows rows = (Rows)response; boolean skipMetadataOnResponse = rows.result.metadata.flags.contains(Flag.NO_METADATA); if (skipMetadataOnResponse != skipMetadataOnRequest) { logger.warn("Inconsistent skipMetadata on streamId {}, was {} in request but {} in response", request.getStreamId(), skipMetadataOnRequest, skipMetadataOnResponse); } }
We observed the warning with (false, true) during our tests.