[ 
https://issues.apache.org/jira/browse/CASSANDRA-13992?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16246907#comment-16246907
 ] 

Kurt Greaves commented on CASSANDRA-13992:
------------------------------------------

So it seems that prepare does return an empty digest, however 
{{ResultSet.ResultMetadata.EMPTY}} is created with {{compute}} and is thus a 
thread local digest, which will get a different hash. From what I can see EMPTY 
is only ever used in one place worth mentioning, and that's in 
{{org.apache.cassandra.cql3.ResultSet.ResultMetadata#fromPrepared}} (it's also 
used in {{org.apache.cassandra.transport.Message.Codec#decode}} but only for 
protocol versions prior to V1), and will be used for anything that's not a 
{{SELECT}} statement. 

Now, what I'm wondering is there any significant reason the ID for an "EMPTY" 
metadata ID is created as a thread local digest?
If we can change empty to instead use {{MD5Digest.wrap()}} we solve the 
prepared problem.

[~omichallat] Before I waste a lot of time figuring out how to test this in the 
driver, can you point me at how you did it?

bq. Since in this case it seems what will happen is when table is ALTER'ed, 
metadata won't update (I haven't checked it though)
Yes we'll probably need to do something about this. I'll write up some tests 
first. 


> Don't send new_metadata_id for conditional updates
> --------------------------------------------------
>
>                 Key: CASSANDRA-13992
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-13992
>             Project: Cassandra
>          Issue Type: Bug
>            Reporter: Olivier Michallat
>            Assignee: Kurt Greaves
>            Priority: Minor
>
> This is a follow-up to CASSANDRA-10786.
> Given the table
> {code}
> CREATE TABLE foo (k int PRIMARY KEY)
> {code}
> And the prepared statement
> {code}
> INSERT INTO foo (k) VALUES (?) IF NOT EXISTS
> {code}
> The result set metadata changes depending on the outcome of the update:
> * if the row didn't exist, there is only a single column \[applied] = true
> * if it did, the result contains \[applied] = false, plus the current value 
> of column k.
> The way this was handled so far is that the PREPARED response contains no 
> result set metadata, and therefore all EXECUTE messages have SKIP_METADATA = 
> false, and the responses always include the full (and correct) metadata.
> CASSANDRA-10786 still sends the PREPARED response with no metadata, *but the 
> response to EXECUTE now contains a {{new_metadata_id}}*. The driver thinks it 
> is because of a schema change, and updates its local copy of the prepared 
> statement's result metadata.
> The next EXECUTE is sent with SKIP_METADATA = true, but the server appears to 
> ignore that, and still sends the metadata in the response. So each response 
> includes the correct metadata, the driver uses it, and there is no visible 
> issue for client code.
> The only drawback is that the driver updates its local copy of the metadata 
> unnecessarily, every time. We can work around that by only updating if we had 
> metadata before, at the cost of an extra volatile read. But I think the best 
> thing to do would be to never send a {{new_metadata_id}} in for a conditional 
> update.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to