{"push_id":1019069925,"size":11,"distinct_size":11,"ref":"refs/heads/master","head":"d4b4baad98152f474a35700a401745a11042208d","before":"f747df2aff2b3a39bacfc0c8e21c13074e3ab70d","commits":[{"sha":"77dbe3c12fccf5f7f58b46b31794d94e073be3c9","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"storage_proxy: fix reconciliation with limits\n\nCurrently, if there is a disagreement between replicas we get mutations\nfrom all of them, merge this mutations and send the result to the\nclient, difference between the result and the mutation sent by a\nparticular replica is sent back to repair it.\nUnfortunately, that may not suffice to provide user with correct results\nin case of disagreements.\n\nConsider the following scenario:\n\ncreate table cf(p int, c int, r int, primary key(p, c));\n\nnode1:\np=0, c=1, r=1 (timestamp = 1)\np=0, c=2, r=2 (timestamp = 2)\n\nnode2:\np=0, c=1, r=tombstone (timestamp = 2)\np=0, c=2, r=1 (timestamp = 1)\n\nquery:\nselect r from cf limit 1;\n\nLet's assume there are no row markers. node1 will send only outdated\ncell (p=0, c=1, r=1) while node2 will send both tombstone for c=1 and\noutdated cell (p=0, c=2, r=1). A disagreement will be detected, the\nreplies will be merged and the coordinator will respond to the client\nwith result r=1, while the correct answer is r=2.\n\nThe solution proposed in this patch is to attempt to detect cases when\nthe problem may occur and retry queries with larger limit which result\nin replicas providing more information.\n\nThe detection logic is simple: the partition key and clustering key of\nthe last row in the reconciled result are compared with the partition\nkeys and clustering keys of the last rows of replies from replicas\n(except short reads). If the (pk, ck) of the replica last row is smaller\nthan the (pk, ck) of the reconciled result the query is retried.\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/77dbe3c12fccf5f7f58b46b31794d94e073be3c9"},{"sha":"c1f7f11d54d014c8dcdcf54f8aed86b3c8942a9a","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"mutation_partition: do not add ck to result when not asked to\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/c1f7f11d54d014c8dcdcf54f8aed86b3c8942a9a"},{"sha":"23ee493d91a08e3a68ed4110225753490dc81b70","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"types: make collection_type_impl::deserialize_mutation_form static\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/23ee493d91a08e3a68ed4110225753490dc81b70"},{"sha":"86ba96622e17c0ca4f8695fc6034d3a332c92b83","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"atomic_cell: do not require type to hash collection cell\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/86ba96622e17c0ca4f8695fc6034d3a332c92b83"},{"sha":"3efb10bd08b49cfa8c0e6a29c0a81ae9dc6ed28f","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"result.idl: keep digest together with result\n\nResult digest is going to be computed in query result builder and\nrequire information not available in the query resylt. That's why the\ndigest now needs to be sent to the other nodes together with the result\nas they won't be able compute it on their own.\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/3efb10bd08b49cfa8c0e6a29c0a81ae9dc6ed28f"},{"sha":"15fd3e96ff1cb04f0ab849e5d335824621b67db2","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"md5_hasher: add finalize_array()\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/15fd3e96ff1cb04f0ab849e5d335824621b67db2"},{"sha":"46079f763bec8e9c66b9b0a25511f9771e82f1c3","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"query: add keys and tombstones to result digest\n\nQuery result digest is used to verify that all replicas have the same\ndata. Therefore, it needs to contain more information than the query\nresult itself in order to ensure proper detection of disagreements.\n\nGenerally, adding clustering keys to the digest regardless of whether\nthe client asked for them will guarantee correctness. However, adding\ntombstones as well improves the chances of early detection of nodes\ncontaining stale data.\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/46079f763bec8e9c66b9b0a25511f9771e82f1c3"},{"sha":"21e2ebcf8cdf8cd299915c52be911a2ec39b594f","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"query: build only result, only digest or both\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/21e2ebcf8cdf8cd299915c52be911a2ec39b594f"},{"sha":"82d2a2dccb96a16c4b429310b74fe2c59abb01d3","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"specify whether query::result, result_digest or both are needed\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/82d2a2dccb96a16c4b429310b74fe2c59abb01d3"},{"sha":"72970c9c90512ccbaa445cf4e7a97b691512e979","author":{"email":"e29bb3265626c60caf76d587cabdfcd8b379ef80@scylladb.com","name":"Paweł Dziepak"},"message":"query: add query::result::_digest to pretty printer\n\nSigned-off-by: Paweł Dziepak <pdziepak@scylladb.com>","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/72970c9c90512ccbaa445cf4e7a97b691512e979"},{"sha":"d4b4baad98152f474a35700a401745a11042208d","author":{"email":"add4fcd06328a394f0ad91feda7ee057316dc5ed@scylladb.com","name":"Pekka Enberg"},"message":"Merge \"Add more information to query result digest\" from Paweł\n\n\"This series adds more information (i.e. keys and tombstones) to the\nquery result digest in order to ensure correctness and increase the\nchances of early detection of disagreement between replicas.\n\nThe digest is no longer computed by hashing query::result but build\nusing the query result builder. That is necessary since the query\nresult itself doesn't contain all information required to compute\nthe digest. Another consequence of this is that now replicas asked\nfor a result need to send both the result and the digest to\nthe coordinator as it won't be able to compute the digest itself.\n\nUnfortunately, these patches change our on wire communication:\n 1) hash computation is different\n 2) format of query::result is changed (and it is made non-final)\n\nFixes #182.\"","distinct":true,"url":"https://api.github.com/repos/scylladb/scylla/commits/d4b4baad98152f474a35700a401745a11042208d"}]}