)]}'
{"swift/common/db_replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f1c33360b63f15bd05e7369a4bc77c59046f1a0c","unresolved":false,"context_lines":[{"line_number":433,"context_line":"            rinfo \u003d json.loads(response.data)"},{"line_number":434,"context_line":"            local_sync \u003d broker.get_sync(rinfo[\u0027id\u0027], incoming\u003dFalse)"},{"line_number":435,"context_line":"            if rinfo.get(\u0027metadata\u0027, \u0027\u0027):"},{"line_number":436,"context_line":"                broker.update_metadata(rinfo[\u0027metadata\u0027])"},{"line_number":437,"context_line":"            if self._in_sync(rinfo, info, broker, local_sync):"},{"line_number":438,"context_line":"                return True"},{"line_number":439,"context_line":"            # if the difference in rowids between the two differs by"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_2f294d37","line":436,"updated":"2017-04-18 22:03:34.000000000","message":"So this part fixes the sender...\n\nOnly rinfo[\u0027metadata\u0027] seems to be a unicode string??\n\nApr 18 21:05:09 saio container-6031: ERROR syncing /srv/node3/sdb3/containers/57/bd3/39b880a15c7bb0ff19200f21b0b2fbd3/39b880a15c7bb0ff19200f21b0b2fbd3.db with node {\u0027index\u0027: 0, u\u0027replication_port\u0027: 6041, u\u0027weight\u0027: 1.0, u\u0027zone\u0027: 4, u\u0027ip\u0027: u\u0027127.0.0.1\u0027, u\u0027region\u0027: 1, u\u0027id\u0027: 3, u\u0027replication_ip\u0027: u\u0027127.0.0.1\u0027, u\u0027meta\u0027: u\u0027\u0027, u\u0027device\u0027: u\u0027sdb4\u0027, u\u0027port\u0027: 6041}: \nTraceback (most recent call last):\n  File \"/vagrant/swift/swift/common/db_replicator.py\", line 551, in _replicate_object\n    different_region)\n  File \"/vagrant/swift/swift/common/db_replicator.py\", line 421, in _repl_to_node\n    different_region\u003ddifferent_region)\n  File \"/vagrant/swift/swift/container/replicator.py\", line 80, in _handle_sync_response\n    node, response, info, broker, http, different_region)\n  File \"/vagrant/swift/swift/common/db_replicator.py\", line 436, in _handle_sync_response\n    broker.update_metadata(rinfo[\u0027metadata\u0027])\n  File \"/vagrant/swift/swift/common/db.py\", line 794, in update_metadata\n    for key, value_timestamp in metadata_updates.items():\nAttributeError: \u0027unicode\u0027 object has no attribute \u0027items\u0027\n\nLooks like we serialize some JSON in our JSON :-(\n\ndiff --git a/swift/common/db_replicator.py b/swift/common/db_replicator.py\nindex 915ac6e..04e1509 100644\n--- a/swift/common/db_replicator.py\n+++ b/swift/common/db_replicator.py\n@@ -433,7 +433,12 @@ class Replicator(Daemon):\n             rinfo \u003d json.loads(response.data)\n             local_sync \u003d broker.get_sync(rinfo[\u0027id\u0027], incoming\u003dFalse)\n             if rinfo.get(\u0027metadata\u0027, \u0027\u0027):\n-                broker.update_metadata(rinfo[\u0027metadata\u0027])\n+                try:\n+                    rmeta \u003d json.loads(rinfo[\u0027metadata\u0027])\n+                except ValueError:\n+                    pass\n+                else:\n+                    broker.update_metadata(rmeta)\n             if self._in_sync(rinfo, info, broker, local_sync):\n                 return True\n             # if the difference in rowids between the two differs by\n\nfixes it","commit_id":"ad15cf2573b807178edbb02b9bc2705c1b144a69"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f1c33360b63f15bd05e7369a4bc77c59046f1a0c","unresolved":false,"context_lines":[{"line_number":824,"context_line":"            objects \u003d existing_broker.get_items_since(point, 1000)"},{"line_number":825,"context_line":"            sleep()"},{"line_number":826,"context_line":"        new_broker.newid(args[0])"},{"line_number":827,"context_line":"        new_broker.update_metadata(existing_broker.metadata)"},{"line_number":828,"context_line":"        renamer(old_filename, db_file)"},{"line_number":829,"context_line":"        return HTTPNoContent()"},{"line_number":830,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_a1aa11cf","line":827,"updated":"2017-04-18 22:03:34.000000000","message":"...and this part fixes the receiver.","commit_id":"ad15cf2573b807178edbb02b9bc2705c1b144a69"}],"test/probe/test_db_replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7d68191fe89aed5632ce41c25ad7244f6d4398b","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # many object updates (over per_diff value of replicator) come to"},{"line_number":42,"context_line":"        # only one container server"},{"line_number":43,"context_line":"        for _ in range(1001):"},{"line_number":44,"context_line":"            obj \u003d \u0027object-%s\u0027 % uuid4()"},{"line_number":45,"context_line":"            client.put_object(self.url, self.token, container, obj, \u0027VERIFY\u0027)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_65a2f84d","line":43,"range":{"start_line":43,"start_character":23,"end_line":43,"end_character":27},"updated":"2017-04-18 01:33:15.000000000","message":"This is good for the default per_diff value of 1000, but means the test takes a while no matter what. Could we peek at the config so developers could choose to push that down to 100 or 10, and tests won\u0027t take so long?\n\nIf I crank this down below per_diff, I get intermittent failures -- is that expected? What should the usync equivalent of this test look like? Also, I think the intermittent-ness may be a sign that we should be using an internal client to check cnode specifically (or we should kill the nodes that got the update).","commit_id":"ad15cf2573b807178edbb02b9bc2705c1b144a69"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f1c33360b63f15bd05e7369a4bc77c59046f1a0c","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # many object updates (over per_diff value of replicator) come to"},{"line_number":42,"context_line":"        # only one container server"},{"line_number":43,"context_line":"        for _ in range(1001):"},{"line_number":44,"context_line":"            obj \u003d \u0027object-%s\u0027 % uuid4()"},{"line_number":45,"context_line":"            client.put_object(self.url, self.token, container, obj, \u0027VERIFY\u0027)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_af6e7d92","line":43,"range":{"start_line":43,"start_character":23,"end_line":43,"end_character":27},"in_reply_to":"7ffa3b31_65a2f84d","updated":"2017-04-18 22:03:34.000000000","message":"We could do something like http://paste.openstack.org/show/607050/ to go off whatever\u0027s in the configs.\n\nLooks like the intermittent failures were separate from whether we use rsync or usync though -- I guess I just happened to get lucky the first time I ran the probe test and the proxy happened to give me a response from one of the servers that got the original POST?\n\nDirect client definitely seems like a win: http://paste.openstack.org/show/607055/","commit_id":"ad15cf2573b807178edbb02b9bc2705c1b144a69"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class TestDbUsyncReplicator(ReplProbeTest):"},{"line_number":27,"context_line":"    object_puts \u003d 1  # Overridden in subclass to force rsync"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_metadata_sync(self):"},{"line_number":30,"context_line":"        # Create container"},{"line_number":31,"context_line":"        container \u003d \u0027container-%s\u0027 % uuid4()"},{"line_number":32,"context_line":"        client.put_container(self.url, self.token, container,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_ee00f969","line":29,"updated":"2017-06-01 09:54:49.000000000","message":"As well as unit test, usync doesn\u0027t have the bug so this should succeed even the code unpatched. The child class for Rsync fails.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d532072d68f9bd611fdf37bff959228ad2bef5ed","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class TestDbUsyncReplicator(ReplProbeTest):"},{"line_number":27,"context_line":"    object_puts \u003d 1  # Overridden in subclass to force rsync"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def test_metadata_sync(self):"},{"line_number":30,"context_line":"        # Create container"},{"line_number":31,"context_line":"        container \u003d \u0027container-%s\u0027 % uuid4()"},{"line_number":32,"context_line":"        client.put_container(self.url, self.token, container,"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_9e176252","line":29,"in_reply_to":"df140735_ee00f969","updated":"2017-06-01 17:48:25.000000000","message":"Correct.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                                           \u0027X-Container-Meta-B\u0027: \u00272\u0027,"},{"line_number":51,"context_line":"                                           \u0027X-Container-Meta-D\u0027: \u00272\u0027})"},{"line_number":52,"context_line":"        except ClientException:"},{"line_number":53,"context_line":"            pass"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # object updates come to only one container server"},{"line_number":56,"context_line":"        for _ in range(self.object_puts):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_ab98b3bf","line":53,"updated":"2017-06-01 09:54:49.000000000","message":"Do we need\n\nelse:\n    self.fail(\u0027Unexpected success for POST container to only 1 node available\u0027)\n\nhere?","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d532072d68f9bd611fdf37bff959228ad2bef5ed","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                                           \u0027X-Container-Meta-B\u0027: \u00272\u0027,"},{"line_number":51,"context_line":"                                           \u0027X-Container-Meta-D\u0027: \u00272\u0027})"},{"line_number":52,"context_line":"        except ClientException:"},{"line_number":53,"context_line":"            pass"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        # object updates come to only one container server"},{"line_number":56,"context_line":"        for _ in range(self.object_puts):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_1e035211","line":53,"in_reply_to":"df140735_ab98b3bf","updated":"2017-06-01 17:48:25.000000000","message":"IDK, it seems weird to fail for unexpected success when the rest of the test verifies that the metadata not only is persisted but eventually makes it to all of the primaries...","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        # containers. In that case, the db file does not information about"},{"line_number":87,"context_line":"        # metadata, so metadata should be synced before replication"},{"line_number":88,"context_line":"        crepl \u003d Server(\u0027container-replicator\u0027)"},{"line_number":89,"context_line":"        crepl.spawn(self.configs[\u0027container-replicator\u0027][cnode[\u0027id\u0027] + 1],"},{"line_number":90,"context_line":"                    once\u003dTrue)"},{"line_number":91,"context_line":"        crepl.interact()"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_ce81b54c","line":89,"range":{"start_line":89,"start_character":57,"end_line":89,"end_character":72},"updated":"2017-06-01 09:54:49.000000000","message":"I think just\n\n self.configs[\u0027container-replicator\u0027][1]\n\nis enough and might be intuitive for readers. Actually we want to run the container-replicator on the cnode so cnode[\u0027id\u0027] + 1 may be confusable. I know actually the config number is in the range starts from 1 (not 0) and node index starts from 0, though.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1058246fa1ffa7d9e244567defdc5bf76ffb7ce5","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        # containers. In that case, the db file does not information about"},{"line_number":87,"context_line":"        # metadata, so metadata should be synced before replication"},{"line_number":88,"context_line":"        crepl \u003d Server(\u0027container-replicator\u0027)"},{"line_number":89,"context_line":"        crepl.spawn(self.configs[\u0027container-replicator\u0027][cnode[\u0027id\u0027] + 1],"},{"line_number":90,"context_line":"                    once\u003dTrue)"},{"line_number":91,"context_line":"        crepl.interact()"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"bf091321_0d4a8126","line":89,"in_reply_to":"df140735_198dac7a","updated":"2017-06-07 23:22:23.000000000","message":"yeah, config_number FTW\n\n        Manager([\u0027container-replicator\u0027]).once(\n            number\u003dself.config_number(cnode))\n\nThis is also a great place to pause the probe test and see how messed up stuff gets:\n\n    ubuntu@saio:~$ for c in $(find /srv/node*/sdb*/containers -name \\*.db); do echo $c; swift-container-info $c | grep \"User Metadata\"; done\n    /srv/node2/sdb2/containers/909/8e3/e35396948c21d98a4f874467f18308e3/e35396948c21d98a4f874467f18308e3.db\n      User Metadata: {\u0027A\u0027: u\u00272\u0027, \u0027C\u0027: u\u00271\u0027, \u0027B\u0027: u\u00272\u0027, \u0027D\u0027: u\u00272\u0027}\n    /srv/node3/sdb3/containers/909/8e3/e35396948c21d98a4f874467f18308e3/e35396948c21d98a4f874467f18308e3.db\n      User Metadata: {\u0027A\u0027: u\u00271\u0027, \u0027C\u0027: u\u00271\u0027, \u0027B\u0027: u\u00273\u0027, \u0027E\u0027: u\u00273\u0027}\n    /srv/node4/sdb4/containers/909/8e3/e35396948c21d98a4f874467f18308e3/e35396948c21d98a4f874467f18308e3.db\n      User Metadata: {\u0027A\u0027: u\u00271\u0027, \u0027C\u0027: u\u00271\u0027, \u0027B\u0027: u\u00273\u0027, \u0027E\u0027: u\u00273\u0027}\n\n\nand if you pick the wrong replicator (like probe test does) w/o metadata sync after rsync you can loose it!","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d532072d68f9bd611fdf37bff959228ad2bef5ed","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        # containers. In that case, the db file does not information about"},{"line_number":87,"context_line":"        # metadata, so metadata should be synced before replication"},{"line_number":88,"context_line":"        crepl \u003d Server(\u0027container-replicator\u0027)"},{"line_number":89,"context_line":"        crepl.spawn(self.configs[\u0027container-replicator\u0027][cnode[\u0027id\u0027] + 1],"},{"line_number":90,"context_line":"                    once\u003dTrue)"},{"line_number":91,"context_line":"        crepl.interact()"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_198dac7a","line":89,"range":{"start_line":89,"start_character":57,"end_line":89,"end_character":72},"in_reply_to":"df140735_ce81b54c","updated":"2017-06-01 17:48:25.000000000","message":"There\u0027s some precedent already: https://github.com/openstack/swift/blob/2.14.0/test/probe/test_container_merge_policy_index.py#L428\n\nI\u0027m not sure that we have any guarantees about which node gets assigned the partition for the test container...","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                self.assertIn(header, resp_headers)"},{"line_number":123,"context_line":"                self.assertEqual(value, resp_headers[header])"},{"line_number":124,"context_line":"            self.assertNotIn(resp_headers.get(\u0027x-container-object-count\u0027),"},{"line_number":125,"context_line":"                             (None, \u00270\u0027, 0))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class TestDbRsyncReplicator(TestDbUsyncReplicator):"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_ce44151e","line":125,"updated":"2017-06-01 09:54:49.000000000","message":"I\u0027d really want to one more iteration for replication cycle that running container-replicator at the rest of nodes (i.e. cnodes). That should result in completing the sync process (I.e. cnode should have x-container-meta-b: 3 and x-container-meta-e: 3)","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1058246fa1ffa7d9e244567defdc5bf76ffb7ce5","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                        for p in self.configs[\u0027container-replicator\u0027].values()]"},{"line_number":133,"context_line":"        # Do more than per_diff object PUTs, to force rsync instead of usync"},{"line_number":134,"context_line":"        self.object_puts \u003d 1 + max(int(c.get(\u0027per_diff\u0027, \u00271000\u0027))"},{"line_number":135,"context_line":"                                   for c in cont_configs)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf091321_727d58e6","line":135,"updated":"2017-06-07 23:22:23.000000000","message":"that\u0027s... quite a few puts ;)","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b56a0ea388fb3fba2628d3e034fd30a10be1da89","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                        for p in self.configs[\u0027container-replicator\u0027].values()]"},{"line_number":133,"context_line":"        # Do more than per_diff object PUTs, to force rsync instead of usync"},{"line_number":134,"context_line":"        self.object_puts \u003d 1 + max(int(c.get(\u0027per_diff\u0027, \u00271000\u0027))"},{"line_number":135,"context_line":"                                   for c in cont_configs)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf091321_ad2a758d","line":135,"in_reply_to":"bf091321_727d58e6","updated":"2017-06-07 23:24:35.000000000","message":"Yeah... there\u0027s a reason I made it read from the config, so I could crank that down to like 10.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"}],"test/unit/common/test_db_replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7d68191fe89aed5632ce41c25ad7244f6d4398b","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        pass"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def update_metadata(self, metadata):"},{"line_number":243,"context_line":"        self.metadata \u003d metadata"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def merge_timestamps(self, created_at, put_timestamp, delete_timestamp):"},{"line_number":246,"context_line":"        self.created_at \u003d created_at"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_65e0b8fb","line":243,"updated":"2017-04-18 01:33:15.000000000","message":"I\u0027m not convinced this is very useful for testing how we merge metadata :-/","commit_id":"ad15cf2573b807178edbb02b9bc2705c1b144a69"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7d68191fe89aed5632ce41c25ad7244f6d4398b","unresolved":false,"context_lines":[{"line_number":1517,"context_line":"        rsynced_db_broker \u003d self.backend("},{"line_number":1518,"context_line":"            os.path.join(self.root, node[\u0027device\u0027], \u0027tmp\u0027, obj_hash + \u0027.db\u0027),"},{"line_number":1519,"context_line":"            account\u003d\u0027a\u0027, container\u003d\u0027b\u0027)"},{"line_number":1520,"context_line":"        rsynced_db_broker.initialize(put_timestamp)"},{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":"        # do rysnc_then_merge"},{"line_number":1523,"context_line":"        rpc \u003d db_replicator.ReplicatorRpc("}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_65b558cd","line":1520,"updated":"2017-04-18 01:33:15.000000000","message":"I\u0027d feel better if this DB had some of its own metadata that ought to be preserved -- \u0027example-remote-meta\u0027 maybe?\n\nAs it is, I\u0027m a little worried that I can apply\n\n diff --git a/swift/common/db_replicator.py b/swift/common/db_replicator.py\n index 915ac6e..9c47186 100644\n --- a/swift/common/db_replicator.py\n +++ b/swift/common/db_replicator.py\n @@ -433,6 +433,9 @@ class Replicator(Daemon):\n              rinfo \u003d json.loads(response.data)\n              local_sync \u003d broker.get_sync(rinfo[\u0027id\u0027], incoming\u003dFalse)\n              if rinfo.get(\u0027metadata\u0027, \u0027\u0027):\n +                broker.update_metadata({\n +                    k: (\u0027\u0027, ts + 0.001)\n +                    for k, (_, ts) in broker.metadata.items()})\n                  broker.update_metadata(rinfo[\u0027metadata\u0027])\n              if self._in_sync(rinfo, info, broker, local_sync):\n                  return True\n @@ -824,6 +827,9 @@ class ReplicatorRpc(object):\n              objects \u003d existing_broker.get_items_since(point, 1000)\n              sleep()\n          new_broker.newid(args[0])\n +        new_broker.update_metadata({\n +            k: (\u0027\u0027, ts + 0.001)\n +            for k, (_, ts) in new_broker.metadata.items()})\n          new_broker.update_metadata(existing_broker.metadata)\n          renamer(old_filename, db_file)\n          return HTTPNoContent()\n\n...and unit tests still pass :-/","commit_id":"ad15cf2573b807178edbb02b9bc2705c1b144a69"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7d68191fe89aed5632ce41c25ad7244f6d4398b","unresolved":false,"context_lines":[{"line_number":1533,"context_line":"        # keep the metadata in existing db"},{"line_number":1534,"context_line":"        self.assertEqual(put_metadata, broker.metadata)"},{"line_number":1535,"context_line":""},{"line_number":1536,"context_line":"    def test_replicator_sync(self):"},{"line_number":1537,"context_line":"        # setup current db (and broker)"},{"line_number":1538,"context_line":"        broker \u003d self._get_broker(\u0027a\u0027, \u0027c\u0027, node_index\u003d0)"},{"line_number":1539,"context_line":"        part, node \u003d self._get_broker_part_node(broker)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ffa3b31_655af82a","line":1536,"updated":"2017-04-18 01:33:15.000000000","message":"This one is *supposed* to already pass on master, yeah?","commit_id":"ad15cf2573b807178edbb02b9bc2705c1b144a69"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":1405,"context_line":"        rinfo \u003d {\"id\": 3, \"point\": -1, \"max_row\": 20, \"hash\": \"b\","},{"line_number":1406,"context_line":"                 \"metadata\": json.dumps(rmetadata)}"},{"line_number":1407,"context_line":"        self.http \u003d ReplHttp(json.dumps(rinfo))"},{"line_number":1408,"context_line":"        self.broker.get_sync()"},{"line_number":1409,"context_line":"        self.assertEqual(self.replicator._repl_to_node("},{"line_number":1410,"context_line":"            self.fake_node, self.broker, \u00270\u0027, self.fake_info), True)"},{"line_number":1411,"context_line":"        metadata \u003d self.broker.metadata"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_f00c5d3c","line":1408,"range":{"start_line":1408,"start_character":0,"end_line":1408,"end_character":30},"updated":"2017-06-01 09:54:49.000000000","message":"Off-topic:\n\nweird. why we need to call broker.get_sync that returns sync point from local db and the return value never assigned anywhere. It looks like abuse but other tests also does like this.\n\nWhen I tried to remove the lines from this and 2 more methods above, nothing fails anyway.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":1406,"context_line":"                 \"metadata\": json.dumps(rmetadata)}"},{"line_number":1407,"context_line":"        self.http \u003d ReplHttp(json.dumps(rinfo))"},{"line_number":1408,"context_line":"        self.broker.get_sync()"},{"line_number":1409,"context_line":"        self.assertEqual(self.replicator._repl_to_node("},{"line_number":1410,"context_line":"            self.fake_node, self.broker, \u00270\u0027, self.fake_info), True)"},{"line_number":1411,"context_line":"        metadata \u003d self.broker.metadata"},{"line_number":1412,"context_line":"        self.assertEqual({}, metadata)"},{"line_number":1413,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_b5c7f745","line":1410,"range":{"start_line":1409,"start_character":0,"end_line":1410,"end_character":68},"updated":"2017-06-01 09:54:49.000000000","message":"nits) why not just using assertTrue?\n\nEr... other tests are doing as same :/","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d532072d68f9bd611fdf37bff959228ad2bef5ed","unresolved":false,"context_lines":[{"line_number":1406,"context_line":"                 \"metadata\": json.dumps(rmetadata)}"},{"line_number":1407,"context_line":"        self.http \u003d ReplHttp(json.dumps(rinfo))"},{"line_number":1408,"context_line":"        self.broker.get_sync()"},{"line_number":1409,"context_line":"        self.assertEqual(self.replicator._repl_to_node("},{"line_number":1410,"context_line":"            self.fake_node, self.broker, \u00270\u0027, self.fake_info), True)"},{"line_number":1411,"context_line":"        metadata \u003d self.broker.metadata"},{"line_number":1412,"context_line":"        self.assertEqual({}, metadata)"},{"line_number":1413,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_6914d544","line":1410,"range":{"start_line":1409,"start_character":0,"end_line":1410,"end_character":68},"in_reply_to":"df140735_b5c7f745","updated":"2017-06-01 17:48:25.000000000","message":"Maybe to check return type? Although, to *really* tighten that up, I suppose we\u0027d want assertIs","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":1409,"context_line":"        self.assertEqual(self.replicator._repl_to_node("},{"line_number":1410,"context_line":"            self.fake_node, self.broker, \u00270\u0027, self.fake_info), True)"},{"line_number":1411,"context_line":"        metadata \u003d self.broker.metadata"},{"line_number":1412,"context_line":"        self.assertEqual({}, metadata)"},{"line_number":1413,"context_line":""},{"line_number":1414,"context_line":"    def test_repl_to_node_not_found(self):"},{"line_number":1415,"context_line":"        self.http \u003d ReplHttp(\u0027{\"id\": 3, \"point\": -1}\u0027, set_status\u003d404)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_d03cb9c9","line":1412,"updated":"2017-06-01 09:54:49.000000000","message":"ok, repl_to_node does not update the local db metadata by remote site metadataA.\n\nAnytime, we are still on the push-data model (no any data pulling from remote)","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d532072d68f9bd611fdf37bff959228ad2bef5ed","unresolved":false,"context_lines":[{"line_number":1409,"context_line":"        self.assertEqual(self.replicator._repl_to_node("},{"line_number":1410,"context_line":"            self.fake_node, self.broker, \u00270\u0027, self.fake_info), True)"},{"line_number":1411,"context_line":"        metadata \u003d self.broker.metadata"},{"line_number":1412,"context_line":"        self.assertEqual({}, metadata)"},{"line_number":1413,"context_line":""},{"line_number":1414,"context_line":"    def test_repl_to_node_not_found(self):"},{"line_number":1415,"context_line":"        self.http \u003d ReplHttp(\u0027{\"id\": 3, \"point\": -1}\u0027, set_status\u003d404)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_09455943","line":1412,"in_reply_to":"df140735_d03cb9c9","updated":"2017-06-01 17:48:25.000000000","message":"Correct. Maybe I should\u0027ve gone ahead and pulled the whole test over to the follow-up... oh well, may as well be explicit.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":1646,"context_line":"        rsynced_db_broker \u003d self.backend("},{"line_number":1647,"context_line":"            os.path.join(self.root, node[\u0027device\u0027], \u0027tmp\u0027, obj_hash + \u0027.db\u0027),"},{"line_number":1648,"context_line":"            account\u003d\u0027a\u0027, container\u003d\u0027b\u0027)"},{"line_number":1649,"context_line":"        rsynced_db_broker.initialize(put_timestamp)"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        # do rysnc_then_merge"},{"line_number":1652,"context_line":"        rpc \u003d db_replicator.ReplicatorRpc("}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_eb86acdb","line":1649,"updated":"2017-06-01 09:54:49.000000000","message":"I think it\u0027s worth that rsynced_db_broker also has its metadata, though testing that the new broker keeps *existing db\u0027s metadata* could be sufficient to assert this change.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"a4f6b6410454b8a1ba8c52794e0a818ec8f623a2","unresolved":false,"context_lines":[{"line_number":1662,"context_line":"        # keep the metadata in existing db"},{"line_number":1663,"context_line":"        self.assertEqual(put_metadata, broker.metadata)"},{"line_number":1664,"context_line":""},{"line_number":1665,"context_line":"    def test_replicator_sync(self):"},{"line_number":1666,"context_line":"        # setup current db (and broker)"},{"line_number":1667,"context_line":"        broker \u003d self._get_broker(\u0027a\u0027, \u0027c\u0027, node_index\u003d0)"},{"line_number":1668,"context_line":"        part, node \u003d self._get_broker_part_node(broker)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df140735_6b7cdcb4","line":1665,"updated":"2017-06-01 09:54:49.000000000","message":"Note for other reviewers:\n\n\"sync\" is not a method this patch wants to fix, there is actually no bug so that when you try to remove the fix line in the code, this test will never fail.","commit_id":"843184f3fea18db367e40cb5f46fc0cb8f2432f6"}]}
