[ https://issues.apache.org/jira/browse/CASSANDRA-8054?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14169297#comment-14169297 ]
Sylvain Lebresne commented on CASSANDRA-8054: --------------------------------------------- I agree that not copying the flags is an overside of the initial patch, though I'd really put the flag copying in the {{copy}} method. But aside that, +1. bq. would prefer the initial Metadata have everything immutable/null in it, and only the Metadata returned from copy() to use mutable things That's why my initial idea in went withCASSANDRA-7120 was to make Metadata basically immutable and copy to do changes, but it forces to do more copy than necessary and required a couple other chances. I don't mind terribly tbh. > EXECUTE request with skipMetadata=false gets no metadata in response > -------------------------------------------------------------------- > > Key: CASSANDRA-8054 > URL: https://issues.apache.org/jira/browse/CASSANDRA-8054 > Project: Cassandra > Issue Type: Bug > Components: Core > Reporter: Olivier Michallat > Assignee: Sylvain Lebresne > Fix For: 2.0.11, 2.1.1 > > Attachments: 8054-2.1.txt, 8054-fix.txt, 8054-v2.txt > > > This has been reported independently with the > [Java|https://datastax-oss.atlassian.net/browse/JAVA-482] and > [C++|https://datastax-oss.atlassian.net/browse/CPP-174] 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: > {code} > 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); > } > } > {code} > We observed the warning with (false, true) during our tests. -- This message was sent by Atlassian JIRA (v6.3.4#6332)