)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e9d16feebc3b6a272c3c78701c3d412853650535","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"496de282_14793878","updated":"2024-05-15 02:34:07.000000000","message":"I noticed the per-process configuration and kwargs/command-line behavior was a little strange and Tim noticed the failure mode is pretty dumb.  AFAICT we could write some tests and plan to merge this to master.","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2454f5a5_a195f762","updated":"2024-05-17 14:09:06.000000000","message":"This seems good","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fd3507c3_a5fc443c","updated":"2024-05-17 15:54:08.000000000","message":"seems like Al might be keen on pushing on some cleanup with me here!  But he\u0027s about to go on vacation ;)\n\nI\u0027m going to try and see if I can get this out of the critical path for parallel task iteration and propose directly to master with the follow-up squashed in.\n\nIf/When it lands - I\u0027ll just absorb it into my ongoing work on the expirer task container listing optimizations!","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"}],"swift/obj/expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e9d16feebc3b6a272c3c78701c3d412853650535","unresolved":true,"context_lines":[{"line_number":405,"context_line":"                             \u0027with dequeue_from_legacy \u003d\u003d true.\u0027)"},{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        self.get_process_values(kwargs)"},{"line_number":409,"context_line":"        pool \u003d GreenPool(self.concurrency)"},{"line_number":410,"context_line":"        self.report_first_time \u003d self.report_last_time \u003d time()"},{"line_number":411,"context_line":"        self.report_objects \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"85a93bfa_98e41f45","side":"PARENT","line":408,"updated":"2024-05-15 02:34:07.000000000","message":"when in run_forever mode with overrides from kwargs, this would just blow up in a loop.\n\nI should add a test to demonstrate the bad behavior.","commit_id":"935f431bb8e49cf7f42a52c5eb035d43fbf9e50a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":true,"context_lines":[{"line_number":145,"context_line":"            (self.conf.get(\u0027expiring_objects_account_name\u0027) or"},{"line_number":146,"context_line":"             \u0027expiring_objects\u0027)"},{"line_number":147,"context_line":"        self.read_conf_for_queue_access(swift)"},{"line_number":148,"context_line":"        self.set_process_values(**conf)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        self.report_interval \u003d float(conf.get(\u0027report_interval\u0027) or 300)"},{"line_number":151,"context_line":"        self.report_first_time \u003d self.report_last_time \u003d time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"f4e4f77b_76255a3f","line":148,"updated":"2024-05-17 14:09:06.000000000","message":"I might have found it easer to grok if the defaults were set here in the constructor\n\n``self.processes \u003d self.process \u003d 0``\n\nbefore calling set_process_values()","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":true,"context_lines":[{"line_number":145,"context_line":"            (self.conf.get(\u0027expiring_objects_account_name\u0027) or"},{"line_number":146,"context_line":"             \u0027expiring_objects\u0027)"},{"line_number":147,"context_line":"        self.read_conf_for_queue_access(swift)"},{"line_number":148,"context_line":"        self.set_process_values(**conf)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        self.report_interval \u003d float(conf.get(\u0027report_interval\u0027) or 300)"},{"line_number":151,"context_line":"        self.report_first_time \u003d self.report_last_time \u003d time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"04fd5c69_985a7c0a","line":148,"in_reply_to":"f4e4f77b_76255a3f","updated":"2024-05-17 15:54:08.000000000","message":"\u003e I might have found it easer to grok\n\nwhich part i wonder?  `set_process_values` *is* unusual in that it expose configuration to command line args... we don\u0027t have a lot of good prior art:\n\nhttps://github.com/openstack/swift/blob/master/swift/container/sharder.py#L2534-L2543\n\noh... maybe just cause I could drop the weird getattr?","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":true,"context_lines":[{"line_number":188,"context_line":"        self.round_robin_task_cache_size \u003d int("},{"line_number":189,"context_line":"            conf.get(\u0027round_robin_task_cache_size\u0027, MAX_OBJECTS_TO_CACHE))"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def read_conf_for_queue_access(self, swift):"},{"line_number":192,"context_line":"        # This is for common parameter with general task queue in future"},{"line_number":193,"context_line":"        self.task_container_prefix \u003d \u0027\u0027"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"32a69f8a_9d71b9c2","line":191,"updated":"2024-05-17 14:09:06.000000000","message":"this method hardly seems worth being separate from the init...\n\nat least, ``self.task_container_prefix \u003d \u0027\u0027`` could move to init and this could become ``make_internal_client()`` or w/e\n\nSee  https://review.opendev.org/c/openstack/swift/+/919960 object-expirer: refactor creating InternalClient","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":true,"context_lines":[{"line_number":188,"context_line":"        self.round_robin_task_cache_size \u003d int("},{"line_number":189,"context_line":"            conf.get(\u0027round_robin_task_cache_size\u0027, MAX_OBJECTS_TO_CACHE))"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def read_conf_for_queue_access(self, swift):"},{"line_number":192,"context_line":"        # This is for common parameter with general task queue in future"},{"line_number":193,"context_line":"        self.task_container_prefix \u003d \u0027\u0027"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"51043ff1_f6e3cee2","line":191,"in_reply_to":"32a69f8a_9d71b9c2","updated":"2024-05-17 15:54:08.000000000","message":"\u003e this method hardly seems worth being separate from the init...\n\nI don\u0027t really understand where the original author was going with this abstraction:\n\nhttps://review.opendev.org/c/openstack/swift/+/517389/47/swift/obj/expirer.py#122\n\nI feel bad pulling it apart without understanding it.  At some level I do sort of still dream of a generalized task queue pattern, and this refactoring in the expirer was supposed to help us get closer to that, but maybe none of that work is relevant anymore?","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e9d16feebc3b6a272c3c78701c3d412853650535","unresolved":true,"context_lines":[{"line_number":394,"context_line":"        \"\"\""},{"line_number":395,"context_line":"        # these config values are available to override at the command line,"},{"line_number":396,"context_line":"        # blow-up now if they\u0027re wrong"},{"line_number":397,"context_line":"        self.set_process_values(**kwargs)"},{"line_number":398,"context_line":"        # This if-clause will be removed when general task queue feature is"},{"line_number":399,"context_line":"        # implemented."},{"line_number":400,"context_line":"        if not self.dequeue_from_legacy:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1333f3e3_55dcd45d","line":397,"updated":"2024-05-15 02:34:07.000000000","message":"AFAIK, the kwargs behavior is untested","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e9d16feebc3b6a272c3c78701c3d412853650535","unresolved":true,"context_lines":[{"line_number":464,"context_line":"        \"\"\""},{"line_number":465,"context_line":"        # these config values are available to override at the command line,"},{"line_number":466,"context_line":"        # blow-up now if they\u0027re wrong"},{"line_number":467,"context_line":"        self.set_process_values(**kwargs)"},{"line_number":468,"context_line":"        sleep(random() * self.interval)"},{"line_number":469,"context_line":"        while True:"},{"line_number":470,"context_line":"            begin \u003d time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"f65cc6c5_5673db6b","line":467,"updated":"2024-05-15 02:34:07.000000000","message":"AFAIK, the kwargs behavior is untested","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        \"\"\""},{"line_number":465,"context_line":"        # these config values are available to override at the command line,"},{"line_number":466,"context_line":"        # blow-up now if they\u0027re wrong"},{"line_number":467,"context_line":"        self.set_process_values(**kwargs)"},{"line_number":468,"context_line":"        sleep(random() * self.interval)"},{"line_number":469,"context_line":"        while True:"},{"line_number":470,"context_line":"            begin \u003d time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"b73b5245_8654be4b","line":467,"in_reply_to":"52d7f74f_7af91a71","updated":"2024-05-17 15:54:08.000000000","message":"Acknowledged","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":true,"context_lines":[{"line_number":464,"context_line":"        \"\"\""},{"line_number":465,"context_line":"        # these config values are available to override at the command line,"},{"line_number":466,"context_line":"        # blow-up now if they\u0027re wrong"},{"line_number":467,"context_line":"        self.set_process_values(**kwargs)"},{"line_number":468,"context_line":"        sleep(random() * self.interval)"},{"line_number":469,"context_line":"        while True:"},{"line_number":470,"context_line":"            begin \u003d time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"52d7f74f_7af91a71","line":467,"in_reply_to":"f65cc6c5_5673db6b","updated":"2024-05-17 14:09:06.000000000","message":"ok, blow up early and blow up once","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":true,"context_lines":[{"line_number":476,"context_line":"            if elapsed \u003c self.interval:"},{"line_number":477,"context_line":"                sleep(random() * (self.interval - elapsed))"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def set_process_values(self, **kwargs):"},{"line_number":480,"context_line":"        \"\"\""},{"line_number":481,"context_line":"        Sets self.processes and self.process from the kwargs if those"},{"line_number":482,"context_line":"        values exist, otherwise, leaves those values as they were set in"}],"source_content_type":"text/x-python","patch_set":1,"id":"a48c1798_050bc1bb","line":479,"updated":"2024-05-17 14:09:06.000000000","message":"that does seem a more appropriate method name","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            if elapsed \u003c self.interval:"},{"line_number":477,"context_line":"                sleep(random() * (self.interval - elapsed))"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def set_process_values(self, **kwargs):"},{"line_number":480,"context_line":"        \"\"\""},{"line_number":481,"context_line":"        Sets self.processes and self.process from the kwargs if those"},{"line_number":482,"context_line":"        values exist, otherwise, leaves those values as they were set in"}],"source_content_type":"text/x-python","patch_set":1,"id":"e516a89f_9c160cb7","line":479,"in_reply_to":"a48c1798_050bc1bb","updated":"2024-05-17 15:54:08.000000000","message":"Acknowledged","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":true,"context_lines":[{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        :param kwargs: Keyword args passed into the run_forever(), run_once()"},{"line_number":486,"context_line":"                       methods.  They have values specified on the command"},{"line_number":487,"context_line":"                       line when the daemon is run."},{"line_number":488,"context_line":"        \"\"\""},{"line_number":489,"context_line":"        self.processes \u003d getattr(self, \u0027processes\u0027, 0)"},{"line_number":490,"context_line":"        if kwargs.get(\u0027processes\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"790be34c_5df4fd01","line":487,"updated":"2024-05-17 14:09:06.000000000","message":"the kwargs can come from conf now too","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":true,"context_lines":[{"line_number":484,"context_line":""},{"line_number":485,"context_line":"        :param kwargs: Keyword args passed into the run_forever(), run_once()"},{"line_number":486,"context_line":"                       methods.  They have values specified on the command"},{"line_number":487,"context_line":"                       line when the daemon is run."},{"line_number":488,"context_line":"        \"\"\""},{"line_number":489,"context_line":"        self.processes \u003d getattr(self, \u0027processes\u0027, 0)"},{"line_number":490,"context_line":"        if kwargs.get(\u0027processes\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1bc7cf81_bfa300b5","line":487,"in_reply_to":"790be34c_5df4fd01","updated":"2024-05-17 15:54:08.000000000","message":"that\u0027s a good point.  #willfix","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":true,"context_lines":[{"line_number":486,"context_line":"                       methods.  They have values specified on the command"},{"line_number":487,"context_line":"                       line when the daemon is run."},{"line_number":488,"context_line":"        \"\"\""},{"line_number":489,"context_line":"        self.processes \u003d getattr(self, \u0027processes\u0027, 0)"},{"line_number":490,"context_line":"        if kwargs.get(\u0027processes\u0027) is not None:"},{"line_number":491,"context_line":"            self.processes \u003d int(kwargs[\u0027processes\u0027])"},{"line_number":492,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7bbd369d_64d19a53","line":489,"updated":"2024-05-17 14:09:06.000000000","message":"took me a while to understand why this is here (to ensure the property is set with a default) - I think the defaults could be set in the constructor?","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":true,"context_lines":[{"line_number":486,"context_line":"                       methods.  They have values specified on the command"},{"line_number":487,"context_line":"                       line when the daemon is run."},{"line_number":488,"context_line":"        \"\"\""},{"line_number":489,"context_line":"        self.processes \u003d getattr(self, \u0027processes\u0027, 0)"},{"line_number":490,"context_line":"        if kwargs.get(\u0027processes\u0027) is not None:"},{"line_number":491,"context_line":"            self.processes \u003d int(kwargs[\u0027processes\u0027])"},{"line_number":492,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"152bc68f_35abb49f","line":489,"in_reply_to":"7bbd369d_64d19a53","updated":"2024-05-17 15:54:08.000000000","message":"ah, yeah - I can\u0027t think of any other place we set defaults without looking in the conf and then immediately override from config - but maybe here it makes sense... or the docstring should just be updated.\n\nPerhaps an explicit/normal pattern of reading attribute values from conf in `__init__` that uses a \"validate_process_settings\" method - and then a helper to override conf defaults from kwargs (that re-uses \"validate_process_settings\") would be most familiar and easy to test?\n\nor leave this method as is, drop the getattrs and use\n\n    conf.setdefault(\u0027processes\u0027, 0)\n    \n???\n\ndifferent ways to do it for sure!  Need to decide if we have the appetite to fix the bug so I can get on with the work I\u0027m here for!","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff14ef3ff799a1cb07bf5b6574c2a16e06e8d6a2","unresolved":true,"context_lines":[{"line_number":325,"context_line":"        expected_msg \u003d \u0027processes must be an integer greater\u0027 \\"},{"line_number":326,"context_line":"                       \u0027 than or equal to 0\u0027"},{"line_number":327,"context_line":"        with self.assertRaises(ValueError) as ctx:"},{"line_number":328,"context_line":"            expirer.ObjectExpirer(vals, swift\u003dself.fake_swift)"},{"line_number":329,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":330,"context_line":"        # from kwargs"},{"line_number":331,"context_line":"        x \u003d expirer.ObjectExpirer({}, swift\u003dself.fake_swift)"}],"source_content_type":"text/x-python","patch_set":1,"id":"93204c66_599f6aef","line":328,"updated":"2024-05-17 14:09:06.000000000","message":"oh, so we actually gain some validation because the constructor now calls set_process_values which does the checks 😊\n\npossibly worth a mention in the commit message\n\nreverting the change in expirer.py\n\n```\ntest_expirer.py::TestObjectExpirer::test_set_process_values_negative_process FAILED [100%]\ntest/unit/obj/test_expirer.py:301 (TestObjectExpirer.test_set_process_values_negative_process)\nself \u003d \u003ctest.unit.obj.test_expirer.TestObjectExpirer testMethod\u003dtest_set_process_values_negative_process\u003e\n\n    def test_set_process_values_negative_process(self):\n        vals \u003d {\n            \u0027processes\u0027: 5,\n            \u0027process\u0027: -1,\n        }\n        # from config\n        expected_msg \u003d \u0027process must be an integer greater\u0027 \\\n                       \u0027 than or equal to 0\u0027\n\u003e       with self.assertRaises(ValueError) as ctx:\nE       AssertionError: ValueError not raised\n\ntest_expirer.py:310: AssertionError\n```","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b153c0fe30c5bea8e7550b81ad6cbe2e6e5b2d1d","unresolved":true,"context_lines":[{"line_number":325,"context_line":"        expected_msg \u003d \u0027processes must be an integer greater\u0027 \\"},{"line_number":326,"context_line":"                       \u0027 than or equal to 0\u0027"},{"line_number":327,"context_line":"        with self.assertRaises(ValueError) as ctx:"},{"line_number":328,"context_line":"            expirer.ObjectExpirer(vals, swift\u003dself.fake_swift)"},{"line_number":329,"context_line":"        self.assertEqual(str(ctx.exception), expected_msg)"},{"line_number":330,"context_line":"        # from kwargs"},{"line_number":331,"context_line":"        x \u003d expirer.ObjectExpirer({}, swift\u003dself.fake_swift)"}],"source_content_type":"text/x-python","patch_set":1,"id":"8b99d9ba_41d6c228","line":328,"in_reply_to":"93204c66_599f6aef","updated":"2024-05-17 15:54:08.000000000","message":"WHAT?\n\n\n```\nvagrant@saio:~$ swift-config /etc/swift/object-expirer.conf.d/ -s object-expirer | grep process\nprocess \u003d -1\nprocesses \u003d 5\nvagrant@saio:~$ swift-object-expirer /etc/swift/object-expirer.conf.d/ once -v\nobject-expirer: Starting 122425\nobject-expirer-ic: Loaded override config for (default): ProxyOverrideOptions({}, {\u0027sorting_method\u0027: \u0027shuffle\u0027, \u0027read_affinity\u0027: \u0027\u0027, \u0027write_affinity\u0027: \u0027\u0027, \u0027write_affinity_node_count\u0027: \u00272 * replicas\u0027, \u0027write_affinity_handoff_delete_count\u0027: None, \u0027rebalance_missing_suppression_count\u0027: 1, \u0027concurrent_gets\u0027: False, \u0027concurrency_timeout\u0027: 0.5, \u0027concurrent_ec_extra_requests\u0027: 0}, app)\nobject-expirer: UNCAUGHT EXCEPTION#012Traceback (most recent call last):#012  File \"/usr/local/bin/swift-object-expirer\", line 7, in \u003cmodule\u003e#012    exec(compile(f.read(), __file__, \u0027exec\u0027))#012  File \"/vagrant/swift/bin/swift-object-expirer\", line 33, in \u003cmodule\u003e#012    run_daemon(ObjectExpirer, conf_file, **options)#012  File \"/vagrant/swift/swift/common/daemon.py\", line 331, in run_daemon#012    DaemonStrategy(d, logger).run(once\u003donce, **kwargs)#012  File \"/vagrant/swift/swift/common/daemon.py\", line 158, in run#012    self._run(once\u003donce, **kwargs)#012  File \"/vagrant/swift/swift/common/daemon.py\", line 230, in _run#012    return self._run_inline(once, **kwargs)#012  File \"/vagrant/swift/swift/common/daemon.py\", line 152, in _run_inline#012    self.daemon.run(once\u003donce, **kwargs)#012  File \"/vagrant/swift/swift/common/daemon.py\", line 64, in run#012    self.run_once(**kwargs)#012  File \"/vagrant/swift/swift/obj/expirer.py\", line 378, in run_once#012    self.get_process_values(kwargs)#012  File \"/vagrant/swift/swift/obj/expirer.py\", line 461, in get_process_values#012    raise ValueError(#012ValueError: process must be an integer greater than or equal to 0\n```\n\nnah.... six one way half a dozen the other","commit_id":"c3ee927dc5c173a0e248056316c54584d524914d"}]}
