)]}'
{"swift/obj/replicator.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"bd15a2e326aba1daf79a3b7cc19a1f7cf9babfa9","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    def _emplace_log_prefix(self, worker_index):"},{"line_number":217,"context_line":"        self.logger.set_prefix(\"[worker %d/%d pid\u003d%d] \" % ("},{"line_number":218,"context_line":"            worker_index + 1,  # use 1-based indexing for more readable logs"},{"line_number":219,"context_line":"            self.replicator_workers,"},{"line_number":220,"context_line":"            os.getpid()))"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _get_my_replication_ips(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_0961153a","line":219,"updated":"2018-04-06 05:35:54.000000000","message":"I know in most real deploys of swift there should be enough devices that self.replicator_workers would be the actual number of workers. But in smaller clusers, or if your passing in the smaller number of override devices (or if you make the replicator_workers option too high) this number isn\u0027t actually the number of workers running. As the number of workers is actaully (on line 284):\n\n  n_workers \u003d min(self.replicator_workers, len(devices_to_replicate))\n\nSo on a SAIO, there is only 1 worker no matter what you put in replicator_workers. This means the logging can look wrong.\n\n  [worker 1/5 pid\u003d11009]...\n  [worker 1/5 pid\u003d11009]...\n  [worker 1/5 pid\u003d11009]... \n  ...\n\nNOTE: the above was with replicator_workers set to 5.\n\nAn op may now complain about what happened to all my other workers. Maybe be could just: http://paste.openstack.org/show/718551/ or something which would always show the correct total. E.g:\n\n  [worker 1/1 pid\u003d11399]... \n  [worker 1/1 pid\u003d11399]... \n  [worker 1/1 pid\u003d11399]...\n  [worker 1/1 pid\u003d11399]...\n  [worker 1/1 pid\u003d11399]...\n  ...\n\nOn my SAIO.","commit_id":"0f680aac46eb14d39c0cededa5f5bf1d8bb93efe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c4d57eed40fa511bd5617d4258fffacd947f8737","unresolved":false,"context_lines":[{"line_number":213,"context_line":"    def total_stats(self):"},{"line_number":214,"context_line":"        return sum(self.stats.values(), Stats())"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _emplace_log_prefix(self, worker_index):"},{"line_number":217,"context_line":"        self.logger.set_prefix(\"[worker %d/%d pid\u003d%d] \" % ("},{"line_number":218,"context_line":"            worker_index + 1,  # use 1-based indexing for more readable logs"},{"line_number":219,"context_line":"            self.replicator_workers,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_225f1673","line":216,"updated":"2018-04-09 23:24:09.000000000","message":"define emplace:  To put into place or position","commit_id":"1093315ca664a16730e7e74f96a5229dd880fd55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c4d57eed40fa511bd5617d4258fffacd947f8737","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                \u0027override_partitions\u0027: override_partitions,"},{"line_number":290,"context_line":"                \u0027multiprocess_worker_index\u0027: i,"},{"line_number":291,"context_line":"            }"},{"line_number":292,"context_line":"            for i in range(self.replicator_workers)]"},{"line_number":293,"context_line":"        for index, device in enumerate(devices_to_replicate):"},{"line_number":294,"context_line":"            idx \u003d index % self.replicator_workers"},{"line_number":295,"context_line":"            worker_args[idx][\u0027override_devices\u0027].append(device)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_82fdc23b","line":292,"updated":"2018-04-09 23:24:09.000000000","message":"the conflict with the distribute_evenly seems minor","commit_id":"1093315ca664a16730e7e74f96a5229dd880fd55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c4d57eed40fa511bd5617d4258fffacd947f8737","unresolved":false,"context_lines":[{"line_number":1056,"context_line":"    def run_once(self, multiprocess_worker_index\u003dNone, *args, **kwargs):"},{"line_number":1057,"context_line":"        if multiprocess_worker_index is not None:"},{"line_number":1058,"context_line":"            self.is_multiprocess_worker \u003d True"},{"line_number":1059,"context_line":"            self._emplace_log_prefix(multiprocess_worker_index)"},{"line_number":1060,"context_line":""},{"line_number":1061,"context_line":"        rsync_reaper \u003d eventlet.spawn(self._child_process_reaper)"},{"line_number":1062,"context_line":"        self.stats \u003d defaultdict(Stats)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_e2d59eb8","line":1059,"updated":"2018-04-09 23:24:09.000000000","message":"i can dig it.","commit_id":"1093315ca664a16730e7e74f96a5229dd880fd55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c4d57eed40fa511bd5617d4258fffacd947f8737","unresolved":false,"context_lines":[{"line_number":1097,"context_line":"                    override_devices\u003dNone, *args, **kwargs):"},{"line_number":1098,"context_line":"        if multiprocess_worker_index is not None:"},{"line_number":1099,"context_line":"            self.is_multiprocess_worker \u003d True"},{"line_number":1100,"context_line":"            self._emplace_log_prefix(multiprocess_worker_index)"},{"line_number":1101,"context_line":"        self.logger.info(_(\"Starting object replicator in daemon mode.\"))"},{"line_number":1102,"context_line":"        eventlet.spawn_n(self._child_process_reaper)"},{"line_number":1103,"context_line":"        # Run the replicator continually"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_6298ae1a","line":1100,"updated":"2018-04-09 23:24:09.000000000","message":"oop, probably time for _setup_multiprocess\n\n    diff --git a/swift/obj/replicator.py b/swift/obj/replicator.py\n    index bf38c1e..09d92e6 100644\n    --- a/swift/obj/replicator.py\n    +++ b/swift/obj/replicator.py\n    @@ -1053,10 +1053,14 @@ class ObjectReplicator(Daemon):\n                         break\n             return recon_update\n     \n    +    def _setup_multiprocess(self, multiprocess_worker_index):\n    +        if multiprocess_worker_index is None:\n    +            return\n    +        self.is_multiprocess_worker \u003d True\n    +        self._emplace_log_prefix(multiprocess_worker_index)\n    +\n         def run_once(self, multiprocess_worker_index\u003dNone, *args, **kwargs):\n    -        if multiprocess_worker_index is not None:\n    -            self.is_multiprocess_worker \u003d True\n    -            self._emplace_log_prefix(multiprocess_worker_index)\n    +        self._setup_multiprocess(multiprocess_worker_index)\n     \n             rsync_reaper \u003d eventlet.spawn(self._child_process_reaper)\n             self.stats \u003d defaultdict(Stats)\n    @@ -1095,9 +1099,7 @@ class ObjectReplicator(Daemon):\n     \n         def run_forever(self, multiprocess_worker_index\u003dNone,\n                         override_devices\u003dNone, *args, **kwargs):\n    -        if multiprocess_worker_index is not None:\n    -            self.is_multiprocess_worker \u003d True\n    -            self._emplace_log_prefix(multiprocess_worker_index)\n    +        self._setup_multiprocess(multiprocess_worker_index)\n             self.logger.info(_(\"Starting object replicator in daemon mode.\"))\n             eventlet.spawn_n(self._child_process_reaper)\n             # Run the replicator continually","commit_id":"1093315ca664a16730e7e74f96a5229dd880fd55"}],"test/unit/obj/test_ssync_sender.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"918460bc6fa306d16fbed66e5b61b7ade5356c16","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    def test_call_catches_exception_handling_exception(self):"},{"line_number":153,"context_line":"        self.sender.node \u003d None  # Will cause inside exception handler to fail"},{"line_number":154,"context_line":"        self.sender.suffixes \u003d [\u0027abc\u0027]"},{"line_number":155,"context_line":"        self.sender.connect \u003d \u0027cause exception\u0027"},{"line_number":156,"context_line":"        success, candidates \u003d self.sender()"},{"line_number":157,"context_line":"        self.assertFalse(success)"},{"line_number":158,"context_line":"        self.assertEqual(candidates, {})"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_eb531d16","line":155,"updated":"2018-03-28 18:37:14.000000000","message":"Now that I think more about it, this change strongly hints that something fishy is going on here. LoggerAdapters are supposed to be transparent, so why did the colon go away?","commit_id":"bce7c8b2ef7fa163f2a7b03cefc820368d958ed8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c4d57eed40fa511bd5617d4258fffacd947f8737","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        super(TestSender, self).setUp()"},{"line_number":90,"context_line":"        self.daemon_logger \u003d debug_logger(\u0027test-ssync-sender\u0027)"},{"line_number":91,"context_line":"        self.daemon \u003d ObjectReplicator(self.daemon_conf,"},{"line_number":92,"context_line":"                                       self.daemon_logger)"},{"line_number":93,"context_line":"        job \u003d {\u0027policy\u0027: POLICIES.legacy}  # sufficient for Sender.__init__"},{"line_number":94,"context_line":"        self.sender \u003d ssync_sender.Sender(self.daemon, None, job, None)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_a28d66d4","line":92,"updated":"2018-04-09 23:24:09.000000000","message":"ugh oh, does this mean we can\u0027t generally wrap our debug logger in a prefix adapter?\n\nI guess we got the whole get_lines_for_level thing... but... not testing what we\u0027re acctually logging is is part of where the debug logger came from?  this seems to take a small step backwards (but maybe saves some test churn?)","commit_id":"1093315ca664a16730e7e74f96a5229dd880fd55"}]}
