)]}'
{"etc/container-reconciler.conf-sample":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a99a476db96d429491c3e9969fff31cc01283463","unresolved":false,"context_lines":[{"line_number":40,"context_line":"# processes \u003d 0"},{"line_number":41,"context_line":"# process is which of the parts a particular process will work on"},{"line_number":42,"context_line":"#  it\u0027s \"zero based\", if you want to use 3 processes, you should run"},{"line_number":43,"context_line":"#  multiple instances of the reconciler with process set to 0, 1, and 2"},{"line_number":44,"context_line":"# process \u003d 0"},{"line_number":45,"context_line":"# cover is the number of additional parts that this process will also do work"},{"line_number":46,"context_line":"#  for, settings this to 2 would mean that all parts will be worked on by at"}],"source_content_type":"application/octet-stream","patch_set":7,"id":"da36d5c6_17078082","line":43,"updated":"2017-02-25 19:26:46.000000000","message":"yes, this could probably get added to the admin or deploy guide - esp. if the reconciler has a config section already","commit_id":"c5ac8e4e199ed7de9b76b47d28756f626811f0ab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":60,"context_line":"# concurrency \u003d 1"},{"line_number":61,"context_line":"# processes is how many parts to divide the work into, one part per"},{"line_number":62,"context_line":"#  process that will be doing the work, the default value of 0 means this"},{"line_number":63,"context_line":"#  process will attempt to do all the work"},{"line_number":64,"context_line":"# processes \u003d 0"},{"line_number":65,"context_line":"# process is which of the parts a particular process will work on"},{"line_number":66,"context_line":"#  it\u0027s \"zero based\", if you want to use 3 processes, you should run"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"8a1be6a3_f5d03eaa","line":63,"updated":"2021-07-13 19:57:53.000000000","message":"Maybe point out that this should be uniform throughout the cluster.","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":69,"context_line":"# cover is the number of additional parts that this process will also do work"},{"line_number":70,"context_line":"#  for, settings this to 2 would mean that all parts will be worked on by at"},{"line_number":71,"context_line":"#  least three processes to provide protection if a single process is offline."},{"line_number":72,"context_line":"# cover \u003d 0"},{"line_number":73,"context_line":"# because the processes in the group will co-ordinate their schedule their"},{"line_number":74,"context_line":"#  scheduling may be effected by clock drift.  clock_accuracy is the maximum"},{"line_number":75,"context_line":"#  number of seconds the system time on your container-reconciler servers may"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"9f18b058_8095b846","line":72,"updated":"2021-07-13 19:57:53.000000000","message":"Is this a reasonable default? I feel like 1 or 2 would be better. Or\n\n max(0, min(processes - 1, 2))","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":75,"context_line":"#  number of seconds the system time on your container-reconciler servers may"},{"line_number":76,"context_line":"#  differ.  You can tune to ensure work resumes quickly after restart, and"},{"line_number":77,"context_line":"#  only a single process will start with-in the configured interval, but you"},{"line_number":78,"context_line":"#  should not need to change this setting unless you have very high time drift"},{"line_number":79,"context_line":"#  between your servers or a particularly low interval."},{"line_number":80,"context_line":"# clock_accuracy \u003d 3.0"},{"line_number":81,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":13,"id":"df61524d_2098e892","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":41},"updated":"2021-07-13 19:57:53.000000000","message":"YAGNI?","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"}],"swift/container/reconciler.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"bbfa3f28df8d684334709e8473400e1060b857e7","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        try:"},{"line_number":801,"context_line":"            return self.reconcile()"},{"line_number":802,"context_line":"        except (Exception, Timeout):"},{"line_number":803,"context_line":"            self.logger.exception(\u0027Unhandled Exception trying to reconcile\u0027)"},{"line_number":804,"context_line":"        finally:"},{"line_number":805,"context_line":"            self.log_stats(force\u003dTrue)"},{"line_number":806,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_d4cef4b3","line":803,"updated":"2014-07-02 02:32:22.000000000","message":"This except is catching more then just an unhandled exception (Exception) but a Timeout as well. Seeing as we are logging the unhandled exception, with out giving any information on it, should be also log if it was a timeout, to aid in debudding? \n\n    try:\n        return self.reconcile()\n    except Exception:\n        self.logger.exception(\u0027Unhandled Exception trying to reconcile\u0027)\n    except Timeout:\n        self.logger.exception(\u0027Timeout reached while trying to reconcile\u0027)\n    finally:\n        self.log_stats(force\u003dTrue)\n\nOr even log a hint to what the unhandled exception was in relation to?","commit_id":"7f878caad5b3eaea22e55f62765d46af8f1fb776"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"243d1cc66f771441a5ea3afed3e0b0218e6739ae","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        try:"},{"line_number":801,"context_line":"            return self.reconcile()"},{"line_number":802,"context_line":"        except (Exception, Timeout):"},{"line_number":803,"context_line":"            self.logger.exception(\u0027Unhandled Exception trying to reconcile\u0027)"},{"line_number":804,"context_line":"        finally:"},{"line_number":805,"context_line":"            self.log_stats(force\u003dTrue)"},{"line_number":806,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_b24a6625","line":803,"in_reply_to":"baada198_777371e7","updated":"2014-07-10 06:40:18.000000000","message":"I\u0027ve delved into the logger exception handling in swift, and you are correct it handles timeouts. \n\nNot that I didn\u0027t think you were correct, it was a good chance for me to look at some code I hadn\u0027t looked at yet. So thanks for educating me, I really appreciate it :)","commit_id":"7f878caad5b3eaea22e55f62765d46af8f1fb776"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ebaef97aafab8878535bc84dfb7b694bcafca60","unresolved":false,"context_lines":[{"line_number":800,"context_line":"        try:"},{"line_number":801,"context_line":"            return self.reconcile()"},{"line_number":802,"context_line":"        except (Exception, Timeout):"},{"line_number":803,"context_line":"            self.logger.exception(\u0027Unhandled Exception trying to reconcile\u0027)"},{"line_number":804,"context_line":"        finally:"},{"line_number":805,"context_line":"            self.log_stats(force\u003dTrue)"},{"line_number":806,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_777371e7","line":803,"in_reply_to":"baada198_d4cef4b3","updated":"2014-07-09 19:35:11.000000000","message":"i was just trying to avoid a bare except.\n\nI actually think our logger.exception does some sillyness to format timeout exceptions sorta sexy already - the point is something went wrong somewhere I didn\u0027t expect so I want it to log where but not die.\n\nI\u0027m not sure if there\u0027s anything that can raise a timeout where it\u0027s not already being handled (direct client call are mostly in GreenPools, internal client should mostly translate them to 5XX).  If I wanted to \"handle\" a Timeout it\u0027d be better to go find all the calls that might raise Timeout and handle the exception closer to where it went wrong - not sure there\u0027s any value in pretending like I\u0027m breaking them up here.","commit_id":"7f878caad5b3eaea22e55f62765d46af8f1fb776"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"626c7bc3c51d999d3f80f6519583ae231fcd1153","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        next_run \u003d (worker_offset + math.ceil("},{"line_number":823,"context_line":"            (now + 1e-5 - worker_offset) / full_cycle) * full_cycle)"},{"line_number":824,"context_line":"        if startup and now \u003c\u003d next_run - full_cycle + self.interval:"},{"line_number":825,"context_line":"            next_run -\u003d full_cycle"},{"line_number":826,"context_line":"        return next_run"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"    def next_run(self, now, startup\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a016987_8615664a","line":825,"updated":"2015-05-28 02:27:53.000000000","message":"This maths is hurting my head, thanks clay :P","commit_id":"4416d1d16b3b8d28329132c759bec309579fcf75"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4845a91a94aff698454009a9d7b1afe721fb38bb","unresolved":true,"context_lines":[{"line_number":387,"context_line":"        cover \u003d max(int(self.conf.get(\u0027cover\u0027, 0)), 0)"},{"line_number":388,"context_line":"        total_procs \u003d min(cover + 1, self.processes)"},{"line_number":389,"context_line":"        # offset backwards into the process \"ring\""},{"line_number":390,"context_line":"        cover_offset \u003d -1 * int(self.processes // total_procs)"},{"line_number":391,"context_line":"        # full set of all procs (including this one) whose queue entries will"},{"line_number":392,"context_line":"        # get handled in cover mode"},{"line_number":393,"context_line":"        self.cover_procs \u003d set([((self.process + (n * cover_offset)) %"}],"source_content_type":"text/x-python","patch_set":12,"id":"955d7635_85a08651","line":390,"updated":"2021-06-22 03:39:38.000000000","message":"Why negative? It\u0027s a modulo ring, so it would be symmetric if positive.\n\nIt\u0027s not important, but I think it\u0027s not \"offset\", but \"pitch\" or \"step\".","commit_id":"50f06041cd12d3f1940aee3a832f93ef464717a9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f0c5b3dc95378ca8818f1617ae251012c7fc229","unresolved":true,"context_lines":[{"line_number":387,"context_line":"        cover \u003d max(int(self.conf.get(\u0027cover\u0027, 0)), 0)"},{"line_number":388,"context_line":"        total_procs \u003d min(cover + 1, self.processes)"},{"line_number":389,"context_line":"        # offset backwards into the process \"ring\""},{"line_number":390,"context_line":"        cover_offset \u003d -1 * int(self.processes // total_procs)"},{"line_number":391,"context_line":"        # full set of all procs (including this one) whose queue entries will"},{"line_number":392,"context_line":"        # get handled in cover mode"},{"line_number":393,"context_line":"        self.cover_procs \u003d set([((self.process + (n * cover_offset)) %"}],"source_content_type":"text/x-python","patch_set":12,"id":"3e90ef79_63d273d9","line":390,"in_reply_to":"955d7635_85a08651","updated":"2021-07-13 18:32:53.000000000","message":"I don\u0027t *think* it\u0027s *that* important - but I may have been thinking about specifically \"covering for\" processes \"earlier\" in the ring instead of \"ahead\" of you in the ring because thoes \"behind\" you would have already had a chance to clean their rows\n\nit ends up only really effecting \"test_cover_look_behind\" and not obviously in a significant way:\n\n\t\t expected \u003d (\n\t-            set([0, 4, 3, 2]),\n\t-            set([1, 0, 4, 3]),\n\t-            set([2, 1, 0, 4]),\n\t-            set([3, 2, 1, 0]),\n\t-            set([4, 3, 2, 1]),\n\t+            set([0, 1, 2, 3]),\n\t+            set([1, 2, 3, 4]),\n\t+            set([2, 3, 4, 0]),\n\t+            set([3, 4, 0, 1]),\n\t+            set([4, 0, 1, 2]),\n\t\t )","commit_id":"50f06041cd12d3f1940aee3a832f93ef464717a9"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4845a91a94aff698454009a9d7b1afe721fb38bb","unresolved":true,"context_lines":[{"line_number":771,"context_line":"        \"\"\""},{"line_number":772,"context_line":"        try:"},{"line_number":773,"context_line":"            obj_info \u003d parse_raw_obj(raw_obj)"},{"line_number":774,"context_line":"        except Exception:"},{"line_number":775,"context_line":"            self.stats_log(\u0027invalid_record\u0027,"},{"line_number":776,"context_line":"                           \u0027invalid queue record: %r\u0027, raw_obj,"},{"line_number":777,"context_line":"                           level\u003dlogging.ERROR, exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ab55f227_4baf124b","line":774,"updated":"2021-06-22 03:39:38.000000000","message":"I hate this with a passion of a 1000 suns. Was there really no way to catch ValueError alone?","commit_id":"50f06041cd12d3f1940aee3a832f93ef464717a9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f0c5b3dc95378ca8818f1617ae251012c7fc229","unresolved":true,"context_lines":[{"line_number":771,"context_line":"        \"\"\""},{"line_number":772,"context_line":"        try:"},{"line_number":773,"context_line":"            obj_info \u003d parse_raw_obj(raw_obj)"},{"line_number":774,"context_line":"        except Exception:"},{"line_number":775,"context_line":"            self.stats_log(\u0027invalid_record\u0027,"},{"line_number":776,"context_line":"                           \u0027invalid queue record: %r\u0027, raw_obj,"},{"line_number":777,"context_line":"                           level\u003dlogging.ERROR, exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"e580ddb9_91820e9a","line":774,"in_reply_to":"ab55f227_4baf124b","updated":"2021-07-13 18:32:53.000000000","message":"ha! yeah ValueError seems fine #willfix","commit_id":"50f06041cd12d3f1940aee3a832f93ef464717a9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":357,"context_line":"    Move objects that are in the wrong storage policy."},{"line_number":358,"context_line":"    \"\"\""},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"    def __init__(self, conf, logger\u003dNone, swift\u003dNone):"},{"line_number":361,"context_line":"        self.conf \u003d conf"},{"line_number":362,"context_line":"        # This option defines how long an un-processable misplaced object"},{"line_number":363,"context_line":"        # marker will be retried before it is abandoned.  It is not coupled"}],"source_content_type":"text/x-python","patch_set":13,"id":"6bc33e27_0dc4093f","line":360,"range":{"start_line":360,"start_character":29,"end_line":360,"end_character":52},"updated":"2021-07-13 19:57:53.000000000","message":"Mainly for tests, yeah?","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":378,"context_line":"        self.last_stat_time \u003d time.time()"},{"line_number":379,"context_line":"        # for managing multiple reconcilers"},{"line_number":380,"context_line":"        self.concurrency \u003d max(int(conf.get(\u0027concurrency\u0027, 1)), 1)"},{"line_number":381,"context_line":"        self.processes \u003d max(int(self.conf.get(\u0027processes\u0027, 1)), 1)"},{"line_number":382,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":383,"context_line":"        if self.process \u003e\u003d self.processes:"},{"line_number":384,"context_line":"            raise ValueError(\u0027process is zero indexed and must be less than \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"a4af4950_6975785c","line":381,"range":{"start_line":381,"start_character":60,"end_line":381,"end_character":66},"updated":"2021-07-13 19:57:53.000000000","message":"I thought we said the default was zero ;-)\n\nI wonder if it\u0027d be better to use config_positive_int_value for these two, though.","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":379,"context_line":"        # for managing multiple reconcilers"},{"line_number":380,"context_line":"        self.concurrency \u003d max(int(conf.get(\u0027concurrency\u0027, 1)), 1)"},{"line_number":381,"context_line":"        self.processes \u003d max(int(self.conf.get(\u0027processes\u0027, 1)), 1)"},{"line_number":382,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":383,"context_line":"        if self.process \u003e\u003d self.processes:"},{"line_number":384,"context_line":"            raise ValueError(\u0027process is zero indexed and must be less than \u0027"},{"line_number":385,"context_line":"                             \u0027total processes\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"20f2bbe3_b6a95374","line":382,"updated":"2021-07-13 19:57:53.000000000","message":"Maybe use non_negative_int?","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":382,"context_line":"        self.process \u003d int(self.conf.get(\u0027process\u0027, 0))"},{"line_number":383,"context_line":"        if self.process \u003e\u003d self.processes:"},{"line_number":384,"context_line":"            raise ValueError(\u0027process is zero indexed and must be less than \u0027"},{"line_number":385,"context_line":"                             \u0027total processes\u0027)"},{"line_number":386,"context_line":"        # number of other processes to cover (plus one for self)"},{"line_number":387,"context_line":"        cover \u003d max(int(self.conf.get(\u0027cover\u0027, 0)), 0)"},{"line_number":388,"context_line":"        total_procs \u003d min(cover + 1, self.processes)"}],"source_content_type":"text/x-python","patch_set":13,"id":"d9058bf7_c7174e44","line":385,"updated":"2021-07-13 19:57:53.000000000","message":"+1","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":385,"context_line":"                             \u0027total processes\u0027)"},{"line_number":386,"context_line":"        # number of other processes to cover (plus one for self)"},{"line_number":387,"context_line":"        cover \u003d max(int(self.conf.get(\u0027cover\u0027, 0)), 0)"},{"line_number":388,"context_line":"        total_procs \u003d min(cover + 1, self.processes)"},{"line_number":389,"context_line":"        # offset backwards into the process \"ring\""},{"line_number":390,"context_line":"        cover_offset \u003d int(self.processes // total_procs)"},{"line_number":391,"context_line":"        # full set of all procs (including this one) whose queue entries will"}],"source_content_type":"text/x-python","patch_set":13,"id":"8eeaac62_ff77de32","line":388,"updated":"2021-07-13 19:57:53.000000000","message":"I wonder if we should just raise a ValueError if cover \u003e\u003d processes...","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":387,"context_line":"        cover \u003d max(int(self.conf.get(\u0027cover\u0027, 0)), 0)"},{"line_number":388,"context_line":"        total_procs \u003d min(cover + 1, self.processes)"},{"line_number":389,"context_line":"        # offset backwards into the process \"ring\""},{"line_number":390,"context_line":"        cover_offset \u003d int(self.processes // total_procs)"},{"line_number":391,"context_line":"        # full set of all procs (including this one) whose queue entries will"},{"line_number":392,"context_line":"        # get handled in cover mode"},{"line_number":393,"context_line":"        self.cover_procs \u003d set([((self.process + (n * cover_offset)) %"}],"source_content_type":"text/x-python","patch_set":13,"id":"c8488f87_3d2092ad","line":390,"range":{"start_line":390,"start_character":23,"end_line":390,"end_character":26},"updated":"2021-07-13 19:57:53.000000000","message":"nit: Not strictly necessary, given the // and how everything we\u0027re dealing with are ints.","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":390,"context_line":"        cover_offset \u003d int(self.processes // total_procs)"},{"line_number":391,"context_line":"        # full set of all procs (including this one) whose queue entries will"},{"line_number":392,"context_line":"        # get handled in cover mode"},{"line_number":393,"context_line":"        self.cover_procs \u003d set([((self.process + (n * cover_offset)) %"},{"line_number":394,"context_line":"                                 self.processes) for n in range(total_procs)])"},{"line_number":395,"context_line":"        # number of seconds clocks might be out of sync"},{"line_number":396,"context_line":"        self.clock_accuracy \u003d float(conf.get(\u0027clock_accuracy\u0027, 3.0))"}],"source_content_type":"text/x-python","patch_set":13,"id":"bea7c3fc_3f151c3b","line":393,"range":{"start_line":393,"start_character":54,"end_line":393,"end_character":66},"updated":"2021-07-13 19:57:53.000000000","message":"Does the spacing it out matter much? What are the pros/cons of this vs\n\n (self.process + n) % self.processes for n in range(total_procs)\n\n?","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":794,"context_line":"        hash of the queue entry name, it\u0027s process number, and the"},{"line_number":795,"context_line":"        configured number of cover processes."},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        :param raw_obj: the raw container listing entry from the queue"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"        :returns: boolean, True if this process should handle this queue"},{"line_number":800,"context_line":"                  entry this iteration."}],"source_content_type":"text/x-python","patch_set":13,"id":"4edd59ab_c432918f","line":797,"range":{"start_line":797,"start_character":15,"end_line":797,"end_character":22},"updated":"2021-07-13 19:57:53.000000000","message":"I was going to suggest that queue_item might be a better name, but then I saw how this is existing terminology from parse_raw_obj...","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":802,"context_line":"        if (not self.interval_stop) or time.time() \u003c self.interval_stop:"},{"line_number":803,"context_line":"            return True"},{"line_number":804,"context_line":"        obj_name \u003d raw_obj[\u0027name\u0027].encode(\u0027utf8\u0027)"},{"line_number":805,"context_line":"        index \u003d int(md5(obj_name, usedforsecurity\u003dFalse).hexdigest(), 16)"},{"line_number":806,"context_line":"        offset \u003d index % self.processes"},{"line_number":807,"context_line":"        if offset in self.cover_procs:"},{"line_number":808,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":13,"id":"273caf4c_9d7b1238","line":805,"range":{"start_line":805,"start_character":20,"end_line":805,"end_character":23},"updated":"2021-07-13 19:57:53.000000000","message":"I wonder if we could get a cheaper hash function in here... I\u0027m torn -- CRC32 or something would be nice, but given how we\u0027re hashing little more than a user-provided name, there are probably some DoS implications. Actually, without any sort of salt, that\u0027s probably a concern for md5, too...\n\nMaybe we should be using hash_path :-/","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":825,"context_line":"        pool \u003d GreenPool(self.concurrency)"},{"line_number":826,"context_line":"        finished \u003d True"},{"line_number":827,"context_line":"        for container in self._iter_containers():"},{"line_number":828,"context_line":"            self.logger.debug(\u0027checking container %s\u0027, container)"},{"line_number":829,"context_line":"            for raw_obj in self._iter_objects(container):"},{"line_number":830,"context_line":"                if self._should_process(raw_obj):"},{"line_number":831,"context_line":"                    pool.spawn_n("}],"source_content_type":"text/x-python","patch_set":13,"id":"99d1d4e3_b8296875","line":828,"updated":"2021-07-13 19:57:53.000000000","message":"So we ditched \"finished container\" at the end for \"checking container\" at the start? *shrug* w/e","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":829,"context_line":"            for raw_obj in self._iter_objects(container):"},{"line_number":830,"context_line":"                if self._should_process(raw_obj):"},{"line_number":831,"context_line":"                    pool.spawn_n("},{"line_number":832,"context_line":"                        self.process_queue_entry, container, raw_obj)"},{"line_number":833,"context_line":"                else:"},{"line_number":834,"context_line":"                    finished \u003d False"},{"line_number":835,"context_line":"            self.log_stats()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ffab198_70f6f828","line":832,"updated":"2021-07-13 19:57:53.000000000","message":"If this processing fails, should we set finished\u003dFalse?","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"695aabd17cc82d4b1087967e159104870c618a38","unresolved":true,"context_lines":[{"line_number":838,"context_line":""},{"line_number":839,"context_line":"    def run_once(self, *args, **kwargs):"},{"line_number":840,"context_line":"        try:"},{"line_number":841,"context_line":"            return self.reconcile()"},{"line_number":842,"context_line":"        except:  # noqa"},{"line_number":843,"context_line":"            self.logger.exception(\u0027Unhandled Exception trying to reconcile\u0027)"},{"line_number":844,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":13,"id":"58e622ea_07d4c358","line":841,"updated":"2021-07-13 19:57:53.000000000","message":"So this is the only place that uses the new return value for reconcile()? And even run_forever won\u0027t look at *our* return value (but presumably a targeted run would).\n\nThat feels weird, too, though -- won\u0027t that make *this process\u0027s* exit code dependent on the progress of a bunch of *other* nodes in the system? I feel like it\u0027d be better to exit True if we successfully processed all of \"our\" entries, and False if there were any failures.","commit_id":"0c74cb95caebc3510ae9186f09fd3f2113a5298a"}],"swift/proxy/controllers/container.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e2f50374c322beaf61f09b4860f7f670e61a52ab","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\"Handler for HTTP GET/HEAD requests.\"\"\""},{"line_number":86,"context_line":"        if not (self.account_info(self.account_name, req)[1] or"},{"line_number":87,"context_line":"                self.account_name.startswith("},{"line_number":88,"context_line":"                    getattr(self.app, \u0027auto_create_account_prefix\u0027, \u0027.\u0027))):"},{"line_number":89,"context_line":"            return HTTPNotFound(request\u003dreq)"},{"line_number":90,"context_line":"        part \u003d self.app.container_ring.get_part("},{"line_number":91,"context_line":"            self.account_name, self.container_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_fb4a2e26","line":88,"updated":"2014-07-01 08:12:46.000000000","message":"oh, i should have mentioned this in the commit.  I thought i was already doing this in proxy.controllers.base.get_info - but it turns out that only effects the object GET/PUT path and not the container listings which are rejected here if the auto-created account has been created yet.","commit_id":"ad7a9960a7c11bb1e2555eb7d3f7096cb88a2a4f"}],"test/unit/container/test_reconciler.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"bbfa3f28df8d684334709e8473400e1060b857e7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"from swift.container import reconciler"},{"line_number":41,"context_line":"from swift.common import swob, utils, internal_client"},{"line_number":42,"context_line":"from swift.common.direct_client import ClientException"},{"line_number":43,"context_line":"from swift.common.utils import split_path, Timestamp"},{"line_number":44,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":45,"context_line":"from swift.obj import server as obj_server"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_b4d260d0","line":43,"updated":"2014-07-02 02:32:22.000000000","message":"Rather then importing utils a few lines above and then import parts here, why don\u0027t you combine them:\n\n from swift.common.utils import (split_path, Timestamp \n                                 NullLogger, HASH_PATH_SUFFIX)","commit_id":"7f878caad5b3eaea22e55f62765d46af8f1fb776"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ebaef97aafab8878535bc84dfb7b694bcafca60","unresolved":false,"context_lines":[{"line_number":40,"context_line":"from swift.container import reconciler"},{"line_number":41,"context_line":"from swift.common import swob, utils, internal_client"},{"line_number":42,"context_line":"from swift.common.direct_client import ClientException"},{"line_number":43,"context_line":"from swift.common.utils import split_path, Timestamp"},{"line_number":44,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":45,"context_line":"from swift.obj import server as obj_server"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_d7119db0","line":43,"in_reply_to":"baada198_b4d260d0","updated":"2014-07-09 19:35:11.000000000","message":"i don\u0027t think you can patch HASH_PATH_SUFFIX if you import it directly, i could change everywhere that uses NullLogger, Timestamp, and split_path to say utils.NullLogger, utils.Timestamp, utils.split_path\n\nor I could do this, which I think is mostly fine for tests.","commit_id":"7f878caad5b3eaea22e55f62765d46af8f1fb776"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"243d1cc66f771441a5ea3afed3e0b0218e6739ae","unresolved":false,"context_lines":[{"line_number":40,"context_line":"from swift.container import reconciler"},{"line_number":41,"context_line":"from swift.common import swob, utils, internal_client"},{"line_number":42,"context_line":"from swift.common.direct_client import ClientException"},{"line_number":43,"context_line":"from swift.common.utils import split_path, Timestamp"},{"line_number":44,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":45,"context_line":"from swift.obj import server as obj_server"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_8cbc6c6e","line":43,"in_reply_to":"baada198_d7119db0","updated":"2014-07-10 06:40:18.000000000","message":"Yup, good point about patching, as your right, I don\u0027t think you can.. in which case, it\u0027s only tests, so I think it\u0027s ok the way it is.","commit_id":"7f878caad5b3eaea22e55f62765d46af8f1fb776"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f0c5b3dc95378ca8818f1617ae251012c7fc229","unresolved":false,"context_lines":[{"line_number":1807,"context_line":"        else:"},{"line_number":1808,"context_line":"            self.fail(\u0027Invalid config did not raise error!\u0027)"},{"line_number":1809,"context_line":""},{"line_number":1810,"context_line":"    def _check_coverage(self, processes, cover):"},{"line_number":1811,"context_line":"        conf \u003d {\u0027processes\u0027: processes, \u0027cover\u0027: cover}"},{"line_number":1812,"context_line":"        daemons \u003d []"},{"line_number":1813,"context_line":"        for n in range(processes):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_6ebdc6d6","line":1810,"updated":"2021-07-13 18:32:53.000000000","message":"this could use a doc string","commit_id":"c93044b9291a56bfe546751ce998bd7380cd47f8"}]}
