)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":47,"context_line":"In addition, we include a reference implementation of plugin for"},{"line_number":48,"context_line":"the watcher API."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Change-Id: I1be1faec53b2cdfaabf927598f1460e23c206b0a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"ff570b3c_094e1c6e","line":50,"updated":"2020-06-01 19:45:58.000000000","message":"Add a\n\n Co-Authored-By: dsariel \u003cdsariel@redhat.com\u003e\n\nYou\u0027ve put in plenty of work on this and deserve some credit in the history ;-)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0b1869e0936b55107133129be8e8f31b7f79bf38","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   start(self, audit_type, **kwargs)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"   see_object(self, sequence_number, object_metadata, policy_index,"},{"line_number":30,"context_line":"              partition, **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, final_sequence_number, **kwargs)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"924f6b03_b39a9afc","line":29,"range":{"start_line":29,"start_character":20,"end_line":29,"end_character":35},"updated":"2020-11-26 08:54:27.000000000","message":"This doesn\u0027t exist in the code anymore","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"022e3c118e8c4229bd1ce582927c3598f090dcf3","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   start(self, audit_type, **kwargs)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"   see_object(self, sequence_number, object_metadata, policy_index,"},{"line_number":30,"context_line":"              partition, **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, final_sequence_number, **kwargs)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"aeb29065_8704a7a4","line":29,"range":{"start_line":29,"start_character":20,"end_line":29,"end_character":35},"in_reply_to":"924f6b03_b39a9afc","updated":"2020-11-26 20:16:06.000000000","message":"Done","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0b1869e0936b55107133129be8e8f31b7f79bf38","unresolved":true,"context_lines":[{"line_number":29,"context_line":"   see_object(self, sequence_number, object_metadata, policy_index,"},{"line_number":30,"context_line":"              partition, **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, final_sequence_number, **kwargs)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"The auditor will call watcher.start(audit_type) at the start of an"},{"line_number":35,"context_line":"audit pass, watcher.see_object(...) for each object audited, and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"c4331593_c2ad0b3d","line":32,"range":{"start_line":32,"start_character":13,"end_line":32,"end_character":34},"updated":"2020-11-26 08:54:27.000000000","message":"either does that.","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"022e3c118e8c4229bd1ce582927c3598f090dcf3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"   see_object(self, sequence_number, object_metadata, policy_index,"},{"line_number":30,"context_line":"              partition, **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, final_sequence_number, **kwargs)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"The auditor will call watcher.start(audit_type) at the start of an"},{"line_number":35,"context_line":"audit pass, watcher.see_object(...) for each object audited, and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"793a85c1_2d0ebf50","line":32,"range":{"start_line":32,"start_character":13,"end_line":32,"end_character":34},"in_reply_to":"c4331593_c2ad0b3d","updated":"2020-11-26 20:16:06.000000000","message":"Done","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"117fef8e03b47c814875567cffd64738064e7e9b","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   start(self, audit_type, **kwargs)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"   see_object(self, object_metadata, policy_index, partition, df,"},{"line_number":30,"context_line":"              **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, **kwargs)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"166bc356_a67f5173","line":29,"range":{"start_line":29,"start_character":20,"end_line":29,"end_character":60},"updated":"2020-12-10 06:35:00.000000000","message":"I wonder how much of this we could just get from the diskfile... DRY, and all.\n\nEh, probably best not to worry about it too much, right?","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d8e33565bdf866e33debab872f66d64facefdd89","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   start(self, audit_type, **kwargs)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"   see_object(self, object_metadata, policy_index, partition, df,"},{"line_number":30,"context_line":"              **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, **kwargs)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"2be9f0f9_31b15c16","line":29,"range":{"start_line":29,"start_character":20,"end_line":29,"end_character":60},"in_reply_to":"024ef38b_f4f5daf7","updated":"2020-12-10 21:02:28.000000000","message":"Fairly certain it was my fault; I wanted it for https://review.opendev.org/c/openstack/swift/+/744078 -- specifically, I needed to be able to open up the disk file and do some reads (and potentially quarantine).\n\nI\u0027m not sure I\u0027d call it a pain point, though -- but maybe I\u0027m just not understanding the pain. What would be the downside to a signature like\n\n see_object(self, df, **kwargs):\n\n? (Assuming we really can get everything else we\u0027re currently passing from the diskfile.)","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"994cc075c5e25fca3aee2ca7cb220326c04bde58","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   start(self, audit_type, **kwargs)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"   see_object(self, object_metadata, policy_index, partition, df,"},{"line_number":30,"context_line":"              **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, **kwargs)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"024ef38b_f4f5daf7","line":29,"range":{"start_line":29,"start_character":20,"end_line":29,"end_character":60},"in_reply_to":"166bc356_a67f5173","updated":"2020-12-10 16:31:59.000000000","message":"The df is a pain point. Personally, I would prefer to drop it and return to Sam\u0027s original API. The df is only needed if the watcher wants to mess with the object: quarantine it, or delete it. That seems like asking for trouble and I do not remember just how we ended with this approach. The original dark data case that prompted the whole issue only had about 10,000 dark objects per node: very much an amount that can be dumped into a text file for deletion by a shell script.","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"117fef8e03b47c814875567cffd64738064e7e9b","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"This version of the API is implemented on the context of the"},{"line_number":40,"context_line":"auditor itself, without spawning any additional processes."},{"line_number":41,"context_line":"If the plugins are not working well -- hand, crash, or leak --"},{"line_number":42,"context_line":"it\u0027s easier to debug them when there\u0027s no additional complication"},{"line_number":43,"context_line":"of processes that run by themselves."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"0b4f3e26_7c8869c2","line":41,"range":{"start_line":41,"start_character":39,"end_line":41,"end_character":43},"updated":"2020-12-10 06:35:00.000000000","message":"nit: hang","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"994cc075c5e25fca3aee2ca7cb220326c04bde58","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"This version of the API is implemented on the context of the"},{"line_number":40,"context_line":"auditor itself, without spawning any additional processes."},{"line_number":41,"context_line":"If the plugins are not working well -- hand, crash, or leak --"},{"line_number":42,"context_line":"it\u0027s easier to debug them when there\u0027s no additional complication"},{"line_number":43,"context_line":"of processes that run by themselves."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"ae792110_4c2a8672","line":41,"range":{"start_line":41,"start_character":39,"end_line":41,"end_character":43},"in_reply_to":"0b4f3e26_7c8869c2","updated":"2020-12-10 16:31:59.000000000","message":"Done","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4eb1cf7d5a11cc3c5e107bd70a569e31a2b9b4a7","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"   start(self, audit_type, **kwargs)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"   see_object(self, object_metadata, policy_index, partition,"},{"line_number":30,"context_line":"              data_file_path, **kwargs)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"   end(self, **kwargs)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":46,"id":"b6393166_dd103d8a","line":30,"range":{"start_line":29,"start_character":37,"end_line":30,"end_character":28},"updated":"2020-12-24 06:36:30.000000000","message":"I have this inclination to pass an AuditLocation here... and maybe re-work that so callers only ever pass in a path... and maybe add a device property...\n\nOr maybe add a AuditLocation.parse() class method and recommend watchers that care about that sort of thing use it...\n\nIt just seems so redundant that we should pass in both a path like\n\n /srv/node/X/objects-Y/Z/...\n\n*and* explicit args like\n\n policy_index\u003dY, partition\u003dZ\n\n... plus I\u0027m also realizing that both of my stat-gatherers will want to spit things out per-device... I still feel some rough edges on this API 😕","commit_id":"8fccb088e403dfa280d0f5130469432abccc8f62"}],"etc/object-server.conf-sample":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0b1869e0936b55107133129be8e8f31b7f79bf38","unresolved":true,"context_lines":[{"line_number":499,"context_line":"# like the following (note that entry points are qualified by package#):"},{"line_number":500,"context_line":"#"},{"line_number":501,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":502,"context_line":"# action\u003dlog"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"[object-expirer]"},{"line_number":505,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":40,"id":"b794b48f_d0f37562","line":502,"updated":"2020-11-26 08:54:27.000000000","message":"Cool, love how I can pass options to my watchers. Working well in my basic watcher test class :)","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"022e3c118e8c4229bd1ce582927c3598f090dcf3","unresolved":false,"context_lines":[{"line_number":499,"context_line":"# like the following (note that entry points are qualified by package#):"},{"line_number":500,"context_line":"#"},{"line_number":501,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":502,"context_line":"# action\u003dlog"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"[object-expirer]"},{"line_number":505,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":40,"id":"2e87fa3c_1c6b5408","line":502,"in_reply_to":"b794b48f_d0f37562","updated":"2020-11-26 20:16:06.000000000","message":"We primarily settled on this out of consideration for having 2 watchers simultaneously. Better than the old design jamming arguments into the loooong watchers\u003d string.","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"}],"setup.cfg":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    erasure_coding.fs \u003d swift.obj.diskfile:ECDiskFileManager"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"swift.object_audit_watcher \u003d"},{"line_number":136,"context_line":"    dark_data_watcher \u003d swift.obj.audit_dark_data:DarkDataWatcher"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"[egg_info]"},{"line_number":139,"context_line":"tag_build \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":12,"id":"ff570b3c_89c6ac99","line":136,"range":{"start_line":136,"start_character":13,"end_line":136,"end_character":21},"updated":"2020-06-01 19:45:58.000000000","message":"Getting into bike-shedding, but I wonder if we should just have it as \"dark_data\" -- the fact that it\u0027s a watcher should be obvious from the entry point name, or the fact that it would be configured as\n\n watchers \u003d dark_data","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"12cbbb6d687ed4df8ab125e51383adc2c5fb0ee8","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    erasure_coding.fs \u003d swift.obj.diskfile:ECDiskFileManager"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"swift.object_audit_watcher \u003d"},{"line_number":136,"context_line":"    dark_data_watcher \u003d swift.obj.audit_dark_data:DarkDataWatcher"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"[egg_info]"},{"line_number":139,"context_line":"tag_build \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":12,"id":"ff570b3c_2dc7a214","line":136,"range":{"start_line":136,"start_character":13,"end_line":136,"end_character":21},"in_reply_to":"ff570b3c_89c6ac99","updated":"2020-06-10 14:08:11.000000000","message":"Done","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7bcbdb172bde22b2b5299dd41acaf3564edfa800","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    erasure_coding.fs \u003d swift.obj.diskfile:ECDiskFileManager"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"swift.object_audit_watcher \u003d"},{"line_number":137,"context_line":"    dark_data \u003d swift.obj.audit_dark_data:DarkDataWatcher"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"[egg_info]"},{"line_number":140,"context_line":"tag_build \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":37,"id":"3f65232a_2bf9ad4c","line":137,"updated":"2020-10-27 06:18:13.000000000","message":"If we are going to carry some audit watchers in the swift repo, which I definitely think we should! I\u0027d prefer them to have a better path then just inside swift/obj as this obj base dir will get filled as we add more watchers.\n\nMaybe something like: swift/obj/watchers or swift/obj/audit/watchers \n\n ( or maybe even loose the s? swift/obj/audit/watcher )\n\nWhich would change this to:\n\n  dark_data \u003d swift.obj.audit.watchers.audit_dark_data:DarkDataWatcher\n\nIf we have that path we could probably even loose the audit_. So swift.obj.audit.watchers.dark_data:...","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    erasure_coding.fs \u003d swift.obj.diskfile:ECDiskFileManager"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"swift.object_audit_watcher \u003d"},{"line_number":137,"context_line":"    dark_data \u003d swift.obj.audit_dark_data:DarkDataWatcher"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"[egg_info]"},{"line_number":140,"context_line":"tag_build \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":37,"id":"3f65232a_f745c844","line":137,"in_reply_to":"3f65232a_2bf9ad4c","updated":"2020-10-28 03:50:48.000000000","message":"I don\u0027t mind an extra directory. I didn\u0027t realize that writing in-tree watchers may become popular. But I rather not have an empty directory, so swift/obj/watchers seem better to me.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"}],"swift/common/manager.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"d660deff3cc58fe8f8736b846b9fca1fc3a54705","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        \"\"\"start server and run one pass on supporting daemons"},{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        try:"},{"line_number":270,"context_line":"            global SWIFT_DIR"},{"line_number":271,"context_line":"            if kwargs[\u0027SWIFT_DIR\u0027] is not None:"},{"line_number":272,"context_line":"                SWIFT_DIR \u003d kwargs[\u0027SWIFT_DIR\u0027]"},{"line_number":273,"context_line":"        except KeyError:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f560f44_1901deb0","line":270,"updated":"2020-08-12 01:37:24.000000000","message":"This whole segment is highly dubious to me. As it is now, it has no effect.\n\nAre you trying to set an OS-level environment variable, so that auditor would run with it? Then set os.environ[\u0027SWIFT_DIR\u0027].\n\nAlso, no need to trap KeyError. Just use kwargs.get().\n\nOh, and I would not screw with Manager.once() just for this. Surely the test itself can poke around os.environ if it needs that.","commit_id":"9938facccebc45fa41c5ce62163e6fe208025e6c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"2fd5d9828fb507a06a1d9f0b50e3864d0c804910","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    def once(self, *args, **kwargs):"},{"line_number":267,"context_line":"        \"\"\"start server and run one pass on supporting daemons"},{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        try:"},{"line_number":270,"context_line":"            global SWIFT_DIR"},{"line_number":271,"context_line":"            if kwargs[\u0027SWIFT_DIR\u0027] is not None:"},{"line_number":272,"context_line":"                SWIFT_DIR \u003d kwargs[\u0027SWIFT_DIR\u0027]"}],"source_content_type":"text/x-python","patch_set":36,"id":"7f6b1bfe_f6f9954d","line":269,"updated":"2020-10-14 00:45:17.000000000","message":"Forgot about get() or decided not to?","commit_id":"a01047624da1ea440f29e5089cee98c05cf08aa4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        return self.start(**kwargs)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    @command"},{"line_number":266,"context_line":"    def once(self, *args, **kwargs):"},{"line_number":267,"context_line":"        \"\"\"start server and run one pass on supporting daemons"},{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        global SWIFT_DIR"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_4d5076d5","line":266,"range":{"start_line":266,"start_character":19,"end_line":266,"end_character":24},"updated":"2020-10-27 18:07:51.000000000","message":"Where\u0027d the positional args come in?","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        return self.start(**kwargs)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    @command"},{"line_number":266,"context_line":"    def once(self, *args, **kwargs):"},{"line_number":267,"context_line":"        \"\"\"start server and run one pass on supporting daemons"},{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        global SWIFT_DIR"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_2392624c","line":266,"range":{"start_line":266,"start_character":19,"end_line":266,"end_character":24},"in_reply_to":"3f65232a_4d5076d5","updated":"2020-10-28 03:50:48.000000000","message":"I don\u0027t think so, I missed this. My cursory glance tells that run_command will never supply a positional argument.\n\nThe extra definition for args arrived in patch #29, which makes use of calling Manager().once() directly, but it does not supply any positional arguments.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        global SWIFT_DIR"},{"line_number":270,"context_line":"        if kwargs.get(\u0027SWIFT_DIR\u0027) is not None:"},{"line_number":271,"context_line":"            SWIFT_DIR \u003d kwargs[\u0027SWIFT_DIR\u0027]"},{"line_number":272,"context_line":"        kwargs[\u0027once\u0027] \u003d True"},{"line_number":273,"context_line":"        return self.start(**kwargs)"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_0df5de83","line":271,"updated":"2020-10-27 18:07:51.000000000","message":"The long-lasting side-effect feels wrong to me... if we keep this kwarg, I think I\u0027d prefer to do something more like\n\n global SWIFT_DIR\n old_swift_dir \u003d None\n new_swift_dir \u003d kwargs.pop(\u0027SWIFT_DIR\u0027)\n if new_swift_dir is not None:\n     old_swift_dir \u003d SWIFT_DIR\n     SWIFT_DIR \u003d new_swift_dir\n try:\n     ...\n finally:\n     if old_swift_dir is not None:\n         SWIFT_DIR \u003d old_swift_dir\n\nMaybe even move it down a level, into start()?","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        \"\"\""},{"line_number":269,"context_line":"        global SWIFT_DIR"},{"line_number":270,"context_line":"        if kwargs.get(\u0027SWIFT_DIR\u0027) is not None:"},{"line_number":271,"context_line":"            SWIFT_DIR \u003d kwargs[\u0027SWIFT_DIR\u0027]"},{"line_number":272,"context_line":"        kwargs[\u0027once\u0027] \u003d True"},{"line_number":273,"context_line":"        return self.start(**kwargs)"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_633e1adb","line":271,"in_reply_to":"3f65232a_0df5de83","updated":"2020-10-28 03:50:48.000000000","message":"What do you think about the test monkey-patching SWIFT_DIR? This whole part just looks terribly ad-hoc to me.\n{Update: I see you thought about it too. I\u0027ll poke David.}","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"}],"swift/common/utils.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"2fd5d9828fb507a06a1d9f0b50e3864d0c804910","unresolved":false,"context_lines":[{"line_number":3097,"context_line":"            for key, value in section_dict.items():"},{"line_number":3098,"context_line":"                config.set(section_name, key, value)"},{"line_number":3099,"context_line":""},{"line_number":3100,"context_line":"    with open(conf_file, \u0027w\u0027) as configfile:"},{"line_number":3101,"context_line":"        config.write(configfile)"},{"line_number":3102,"context_line":""},{"line_number":3103,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"7f6b1bfe_b6ff1d33","line":3100,"updated":"2020-10-14 00:45:17.000000000","message":"I think this is good enough for tests, but perhaps not for the main code, where it needs more care. I\u0027m going to move it (no changes).","commit_id":"a01047624da1ea440f29e5089cee98c05cf08aa4"}],"swift/obj/audit_dark_data.py":[{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a619d00daf844809877431f67da548a763d83188","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            results \u003d json.loads(resp.read())"},{"line_number":157,"context_line":"            conn.close()"},{"line_number":158,"context_line":"            if results is None or len(results) \u003d\u003d 0:"},{"line_number":159,"context_line":"                return None"},{"line_number":160,"context_line":"            info \u003d results[0]"},{"line_number":161,"context_line":"            if info[\u0027name\u0027] !\u003d obj_name:"},{"line_number":162,"context_line":"                # The object is missing (dark), but the GET query returned"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_ebc66e68","line":159,"updated":"2020-03-06 18:15:13.000000000","message":"You should actually continue because the container you just checked could be lagging updates while an other container could be up-to-date.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0de39a324a94eb9b1f693ba832ee1200aa4e45c3","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            results \u003d json.loads(resp.read())"},{"line_number":157,"context_line":"            conn.close()"},{"line_number":158,"context_line":"            if results is None or len(results) \u003d\u003d 0:"},{"line_number":159,"context_line":"                return None"},{"line_number":160,"context_line":"            info \u003d results[0]"},{"line_number":161,"context_line":"            if info[\u0027name\u0027] !\u003d obj_name:"},{"line_number":162,"context_line":"                # The object is missing (dark), but the GET query returned"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_08a642ac","line":159,"in_reply_to":"1fa4df85_ebc66e68","updated":"2020-03-09 23:56:07.000000000","message":"Okay. Personally I really hate it when people sprinkle \"except Exception\" all over, but let\u0027s make an exception for the top level loop. I copied the failsafe_object_audit() for the invocations that fell outside of it.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"8fc79963d1d79504540c07b985729779794a86a0","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            results \u003d json.loads(resp.read())"},{"line_number":157,"context_line":"            conn.close()"},{"line_number":158,"context_line":"            if results is None or len(results) \u003d\u003d 0:"},{"line_number":159,"context_line":"                return None"},{"line_number":160,"context_line":"            info \u003d results[0]"},{"line_number":161,"context_line":"            if info[\u0027name\u0027] !\u003d obj_name:"},{"line_number":162,"context_line":"                # The object is missing (dark), but the GET query returned"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_43027471","line":159,"in_reply_to":"1fa4df85_ebc66e68","updated":"2020-03-17 00:04:33.000000000","message":"Sorry, the previous comment was a reply to a different issue, and I didn\u0027t fix this one. Give me a few and I\u0027ll address this observation properly.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from six.moves.urllib.parse import quote"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# XXX why not straight from urllib?"},{"line_number":32,"context_line":"from swift.common.bufferedhttp import http_connect"},{"line_number":33,"context_line":"from swift.common.ring import Ring"},{"line_number":34,"context_line":"from swift.common.utils import split_path"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_f3f59958","line":31,"updated":"2020-06-01 19:45:58.000000000","message":"Maybe we could use direct_client instead? https://github.com/openstack/swift/blob/2.25.0/swift/common/direct_client.py#L266","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"12cbbb6d687ed4df8ab125e51383adc2c5fb0ee8","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from six.moves.urllib.parse import quote"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# XXX why not straight from urllib?"},{"line_number":32,"context_line":"from swift.common.bufferedhttp import http_connect"},{"line_number":33,"context_line":"from swift.common.ring import Ring"},{"line_number":34,"context_line":"from swift.common.utils import split_path"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_507f0d65","line":31,"in_reply_to":"ff570b3c_f3f59958","updated":"2020-06-10 14:08:11.000000000","message":"Done by Tim in \"watcher ideas\" https://review.opendev.org/#/c/732441/2/swift/obj/audit_dark_data.py","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    # or do something else about the way we select the container nodes."},{"line_number":134,"context_line":"    # For now we just shuffle. Better than nothing, but in case some nodes"},{"line_number":135,"context_line":"    # are down, auditor slows to a crawl."},{"line_number":136,"context_line":"    # XXX Our tests supply [] for the list of nodes for now. Make sure to"},{"line_number":137,"context_line":"    # mock http_conn and re-test with non-empty list of container servers."},{"line_number":138,"context_line":"    random.shuffle(container_nodes)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    dark_flag \u003d 0"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_f3cc7936","line":137,"range":{"start_line":136,"start_character":6,"end_line":137,"end_character":74},"updated":"2020-06-01 19:45:58.000000000","message":"Yeah, I like that plan! Are these tests still around? I was expecting something like test/unit/obj/test_audit_dark_data.py but I don\u0027t see one...","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3d51117a69c8b6eef140baa3e09d31f4a679e44","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        # is to list objects with a prefix. The shortest name is always the"},{"line_number":153,"context_line":"        # fist and we use limit in order to drop the unnecesasry names."},{"line_number":154,"context_line":"        path \u003d \"/%s/%s\" % (account_name, container_name)"},{"line_number":155,"context_line":"        conn \u003d http_connect(node[\u0027ip\u0027], node[\u0027port\u0027],"},{"line_number":156,"context_line":"                            node[\u0027device\u0027], container_part,"},{"line_number":157,"context_line":"                            \u0027GET\u0027, path.encode(\u0027utf-8\u0027), {},"},{"line_number":158,"context_line":"                            \u0027format\u003djson\u0026prefix\u003d%s\u0026limit\u003d1\u0027 %"},{"line_number":159,"context_line":"                            quote(obj_name.encode(\u0027utf-8\u0027)))"},{"line_number":160,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":161,"context_line":"        if resp.status // 100 \u003d\u003d 2:"},{"line_number":162,"context_line":"            results \u003d json.loads(resp.read())"},{"line_number":163,"context_line":"            conn.close()"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_d9decf3c","line":160,"range":{"start_line":155,"start_character":8,"end_line":160,"end_character":33},"updated":"2020-05-30 05:28:06.000000000","message":"No timeouts?\n\nIf we hit an error, this bombs us out fairly hard, leaving us with not-super-useful logs:\n\n 1 audit watcher(s) loaded\n Begin object audit \"once\" mode (ALL)\n ERROR Trying to audit /srv/node2/sdb2/objects-1/772/0d4/c12e09336ed8e8860750c711cdc0f0d4: Connection refused\n Object audit (ALL). Since Sat May 30 04:21:34 2020: Locally: 0 passed, 0 quarantined, 1 errors, files/sec: 0.00, bytes/sec: 0.00, Total time: 0.02, Auditing time: 0.00, Rate: 0.00\n Object audit (ALL) \"once\" mode completed: 0.07s. Total quarantined: 0, Total errors: 1, Total files/sec: 14.30, Total bytes/sec: 0.00, Auditing time: 0.02, Rate: 0.27\n DarkDataWatcher total unknown 0 ok 0 dark 0\n\nI feel like that should have led to an \"unknown\" status...","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"12cbbb6d687ed4df8ab125e51383adc2c5fb0ee8","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        # is to list objects with a prefix. The shortest name is always the"},{"line_number":153,"context_line":"        # fist and we use limit in order to drop the unnecesasry names."},{"line_number":154,"context_line":"        path \u003d \"/%s/%s\" % (account_name, container_name)"},{"line_number":155,"context_line":"        conn \u003d http_connect(node[\u0027ip\u0027], node[\u0027port\u0027],"},{"line_number":156,"context_line":"                            node[\u0027device\u0027], container_part,"},{"line_number":157,"context_line":"                            \u0027GET\u0027, path.encode(\u0027utf-8\u0027), {},"},{"line_number":158,"context_line":"                            \u0027format\u003djson\u0026prefix\u003d%s\u0026limit\u003d1\u0027 %"},{"line_number":159,"context_line":"                            quote(obj_name.encode(\u0027utf-8\u0027)))"},{"line_number":160,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":161,"context_line":"        if resp.status // 100 \u003d\u003d 2:"},{"line_number":162,"context_line":"            results \u003d json.loads(resp.read())"},{"line_number":163,"context_line":"            conn.close()"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_500f0d87","line":160,"range":{"start_line":155,"start_character":8,"end_line":160,"end_character":33},"in_reply_to":"ff570b3c_d9decf3c","updated":"2020-06-10 14:08:11.000000000","message":"timeout was added by Tim\u0027s patch https://review.opendev.org/#/c/732441/2/swift/obj/audit_dark_data.py","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6f119d4487c504d64ff3a1b2abe88d7b3343254b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from swift.common.ring import Ring"},{"line_number":32,"context_line":"from swift.common.utils import split_path"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from swift.obj import diskfile"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class ContainerError(Exception):"},{"line_number":37,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff570b3c_a1ba0b07","line":34,"updated":"2020-06-10 15:15:05.000000000","message":"I\u0027m a little surprised that you managed to stuff this through pep8, because usually it barfs on unused imports. Or at least I\u0027m unable to find where this is used (all users are commented out).","commit_id":"3f901587a6be135e374bfc49f59c1e59e567c66c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b1bf30a0825fe13848f73949b472fd671879d426","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        # save dark data policy"},{"line_number":60,"context_line":"        object_auditor_conf \u003d readconf(self.conf[\u0027__file__\u0027],"},{"line_number":61,"context_line":"                                       \u0027object-auditor\u0027)"},{"line_number":62,"context_line":"        watcher_configs \u003d config.get(\u0027watchers\u0027, \u0027\u0027)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_e295a141","line":60,"updated":"2020-06-24 16:34:15.000000000","message":"Drop this. You only read from files yourself as a last resort. As we can see below...","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b1bf30a0825fe13848f73949b472fd671879d426","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # save dark data policy"},{"line_number":60,"context_line":"        object_auditor_conf \u003d readconf(self.conf[\u0027__file__\u0027],"},{"line_number":61,"context_line":"                                       \u0027object-auditor\u0027)"},{"line_number":62,"context_line":"        watcher_configs \u003d config.get(\u0027watchers\u0027, \u0027\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.dark_data_policy \u003d None"},{"line_number":65,"context_line":"        for item in watcher_configs:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_c2921d57","line":62,"updated":"2020-06-24 16:34:15.000000000","message":"Surely you meant conf here.","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b1bf30a0825fe13848f73949b472fd671879d426","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.dark_data_policy \u003d None"},{"line_number":65,"context_line":"        for item in watcher_configs:"},{"line_number":66,"context_line":"            if (\u0027dark_data\u0027 in item):"},{"line_number":67,"context_line":"                try: # policy indication comes after the second #"},{"line_number":68,"context_line":"                    self.dark_data_policy \u003d item.split(\"#\")[2]"},{"line_number":69,"context_line":"                except IndexError:"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_0299b577","line":66,"updated":"2020-06-24 16:34:15.000000000","message":"OK. Let\u0027s leave your design in for now, although I\u0027m not entirely happy with a watcher re-scanning config like and finding itself in it. That process is really fraught with problems. I\u0027ll think about a method to pass per-watcher configuration from the auditor down.","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.dark_data_policy \u003d None"},{"line_number":65,"context_line":"        for item in watcher_configs:"},{"line_number":66,"context_line":"            if (\u0027dark_data\u0027 in item):"},{"line_number":67,"context_line":"                try: # policy indication comes after the second #"},{"line_number":68,"context_line":"                    self.dark_data_policy \u003d item.split(\"#\")[2]"},{"line_number":69,"context_line":"                except IndexError:"},{"line_number":70,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_7f801cc0","line":67,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E261 at least two spaces before inline comment","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            break"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def start(self, audit_type):"},{"line_number":75,"context_line":"        self.is_zbf \u003d audit_type \u003d\u003d \u0027ZBF\u0027"},{"line_number":76,"context_line":"        self.tot_unknown \u003d 0"},{"line_number":77,"context_line":"        self.tot_dark \u003d 0"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_5f8558ce","line":74,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def policy_based_object_handling(self, obj_path):"},{"line_number":81,"context_line":"        # either report, quarantine, remove or ignore"},{"line_number":82,"context_line":"        if (self.dark_data_policy \u003d\u003d None):"},{"line_number":83,"context_line":"            pass # ignore"},{"line_number":84,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"quarantine\"):"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_bf6d9433","line":82,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E711 comparison to None should be \u0027if cond is None:\u0027","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    def policy_based_object_handling(self, obj_path):"},{"line_number":81,"context_line":"        # either report, quarantine, remove or ignore"},{"line_number":82,"context_line":"        if (self.dark_data_policy \u003d\u003d None):"},{"line_number":83,"context_line":"            pass # ignore"},{"line_number":84,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"quarantine\"):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"delete\"):"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_9f6a5017","line":83,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E261 at least two spaces before inline comment","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            pass # ignore"},{"line_number":84,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"quarantine\"):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"delete\"):"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"log\"):"},{"line_number":89,"context_line":"            self.logger.info(\"dark %s\" % (obj_path,))"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_ff738c14","line":86,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E112 expected an indented block","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            pass # ignore"},{"line_number":84,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"quarantine\"):"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"delete\"):"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"log\"):"},{"line_number":89,"context_line":"            self.logger.info(\"dark %s\" % (obj_path,))"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_df70480b","line":86,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E999 IndentationError: expected an indented block","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"delete\"):"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"log\"):"},{"line_number":89,"context_line":"            self.logger.info(\"dark %s\" % (obj_path,))"},{"line_number":90,"context_line":"        else:"},{"line_number":91,"context_line":"            pass # TODO: maybe we have to log worning here that the format is wrong?"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_3f634444","line":88,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E112 expected an indented block","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"log\"):"},{"line_number":89,"context_line":"            self.logger.info(\"dark %s\" % (obj_path,))"},{"line_number":90,"context_line":"        else:"},{"line_number":91,"context_line":"            pass # TODO: maybe we have to log worning here that the format is wrong?"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    diskfile_router \u003d DiskFileRouter(conf, self.logger)"},{"line_number":94,"context_line":"    # diskfile_mgr \u003d diskfile_router[policy_index]"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_1f68001b","line":91,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E261 at least two spaces before inline comment","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"log\"):"},{"line_number":89,"context_line":"            self.logger.info(\"dark %s\" % (obj_path,))"},{"line_number":90,"context_line":"        else:"},{"line_number":91,"context_line":"            pass # TODO: maybe we have to log worning here that the format is wrong?"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    diskfile_router \u003d DiskFileRouter(conf, self.logger)"},{"line_number":94,"context_line":"    # diskfile_mgr \u003d diskfile_router[policy_index]"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_7f593c8c","line":91,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E501 line too long (84 \u003e 79 characters)","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b1bf30a0825fe13848f73949b472fd671879d426","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        elif (self.dark_data_policy \u003d\u003d \"log\"):"},{"line_number":89,"context_line":"            self.logger.info(\"dark %s\" % (obj_path,))"},{"line_number":90,"context_line":"        else:"},{"line_number":91,"context_line":"            pass # TODO: maybe we have to log worning here that the format is wrong?"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    diskfile_router \u003d DiskFileRouter(conf, self.logger)"},{"line_number":94,"context_line":"    # diskfile_mgr \u003d diskfile_router[policy_index]"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_82b4a5d2","line":91,"in_reply_to":"bf51134e_7f593c8c","updated":"2020-06-24 16:34:15.000000000","message":"No, it\u0027s too late to log here. You will log on every auditor pass and spam the logs. The validation must be done in __init__. The downside is, you then cannot raise anything sensible. Again, perhaps something to define in the API. I\u0027ll get back to you on this.","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b726a439d67f9155acb2f8e1db967ac846ec0081","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":64,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":65,"context_line":"        if self.dark_data_policy not in [e.value for e in DDAction]:"},{"line_number":66,"context_line":"            self.logger.warning(\"The specified dark data action is not : %s\""},{"line_number":67,"context_line":"                                % list(DDAction))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def start(self, audit_type):"}],"source_content_type":"text/x-python","patch_set":21,"id":"bf51134e_01e39bda","line":66,"updated":"2020-07-09 19:58:14.000000000","message":"I think this can be bikeshedded nicely.\n\n1. This does not specify what the outcome is: a crash or some  default behavior. Should say \"default is log\" or something.\n2. List of Python internals is useless to operator. It needs to be [\"log\", \"delete\", ...], not \"[\u003cDDAction.LOG: \u0027log\u0027\u003e, ...]\".\n\nOverall, I suspect enum is not the right tool for this. I\u0027d  use a set(): easy to check membership. Although, neither has a built-in default member. So, maybe just a list.","commit_id":"a4ab7d873eef67a03b10174462b38701467fc38b"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"ca7bee3f0ad14fa243fc295ce99e0101bfee0212","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":64,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":65,"context_line":"        if self.dark_data_policy not in [e.value for e in DDAction]:"},{"line_number":66,"context_line":"            self.logger.warning(\"The specified dark data action is not : %s\""},{"line_number":67,"context_line":"                                % list(DDAction))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def start(self, audit_type):"}],"source_content_type":"text/x-python","patch_set":21,"id":"bf51134e_63d3d460","line":66,"in_reply_to":"bf51134e_01e39bda","updated":"2020-07-21 23:40:40.000000000","message":"Done","commit_id":"a4ab7d873eef67a03b10174462b38701467fc38b"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"7a90fa88fcf64f7b026ea4f4ebde3b63580a954b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        swift_dir \u003d \u0027/etc/swift\u0027"},{"line_number":56,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":57,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":58,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":59,"context_line":"            self.logger.warning(\"Dark data action defaults to action \u003d \u0027log\u0027\")"},{"line_number":60,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"bf51134e_ef2210ba","line":58,"updated":"2020-07-22 20:19:04.000000000","message":"Do you guys think we ought to put a stake down for \"repair\"? I understand it\u0027s too hard to implement outright, but maybe leave a comment as a reminder?","commit_id":"97d22ac51c32b275f80ea1fc371de33026615837"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"acdf5a1b205e60776f384437742a1f10fcc24ae4","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        if self.is_zbf:"},{"line_number":128,"context_line":"            return"},{"line_number":129,"context_line":"        self.logger.info(\"total unknown %d ok %d dark %d\" %"},{"line_number":130,"context_line":"                         (self.tot_unknown, self.tot_okay, self.tot_dark))"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":28,"id":"9f560f44_0f9f79b4","line":130,"updated":"2020-07-30 23:21:23.000000000","message":"This seems like a common sort of a thing to want to do, dumping stats at the end of a run. Maybe even putting them in recon? What if we had end() expect a dict (or None) to be returned, and the auditor could take care of getting all of them into logs and recon once?","commit_id":"97d22ac51c32b275f80ea1fc371de33026615837"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.tot_okay \u003d 0"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def policy_based_object_handling(self, df):"},{"line_number":70,"context_line":"        try:"},{"line_number":71,"context_line":"            with df.open(modernize\u003dTrue):"},{"line_number":72,"context_line":"                metadata \u003d df.get_metadata()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_5f00d134","line":69,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                metadata \u003d df.get_metadata()"},{"line_number":73,"context_line":"                obj_path \u003d metadata[\u0027name\u0027]"},{"line_number":74,"context_line":"                if self.dark_data_policy \u003d\u003d \"quarantine\":"},{"line_number":75,"context_line":"                    self.logger.info(\"quarantine dark - marked BADETAG %s\" % (obj_path,))"},{"line_number":76,"context_line":"                    metadata[\u0027ETag\u0027] \u003d \"BADETAG\""},{"line_number":77,"context_line":"                    df.write_metadata(metadata)"},{"line_number":78,"context_line":"                elif self.dark_data_policy \u003d\u003d \"log\":"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_bff92d4f","line":75,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E501 line too long (89 \u003e 79 characters)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                else:"},{"line_number":83,"context_line":"                    pass"},{"line_number":84,"context_line":"                df.close()"},{"line_number":85,"context_line":"        except:"},{"line_number":86,"context_line":"            pass"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_9ff6e95c","line":85,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E722 do not use bare \u0027except\u0027","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                else:"},{"line_number":83,"context_line":"                    pass"},{"line_number":84,"context_line":"                df.close()"},{"line_number":85,"context_line":"        except:"},{"line_number":86,"context_line":"            pass"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_ff9445ea","line":85,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: H201: no \u0027except:\u0027 at least use \u0027except Exception:\u0027","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"20a7ba07bd72ac610b1fdc93695616e969ffa7e1","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                else:"},{"line_number":83,"context_line":"                    pass"},{"line_number":84,"context_line":"                df.close()"},{"line_number":85,"context_line":"        except:"},{"line_number":86,"context_line":"            pass"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_c4372ddb","line":85,"in_reply_to":"9f560f44_0de8f3b0","updated":"2020-10-12 12:34:18.000000000","message":"Done","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"5aad49f7b23be42675a45a127d679240c1dd9c22","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                else:"},{"line_number":83,"context_line":"                    pass"},{"line_number":84,"context_line":"                df.close()"},{"line_number":85,"context_line":"        except:"},{"line_number":86,"context_line":"            pass"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_0de8f3b0","line":85,"in_reply_to":"9f560f44_ff9445ea","updated":"2020-09-07 19:46:09.000000000","message":"We discussed the merits of wide-scope ranges at the call today. I think in this case it can be safely omitted in favour of getting caught in see_object().","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            pass"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    # diskfile_router \u003d DiskFileRouter(conf, self.logger)"},{"line_number":90,"context_line":"    # diskfile_mgr \u003d diskfile_router[policy_index]"},{"line_number":91,"context_line":"    # df \u003d diskfile_mgr.get_diskfile_from_audit_location(obj_path)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_df99811f","line":89,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    # diskfile_mgr \u003d diskfile_router[policy_index]"},{"line_number":91,"context_line":"    # df \u003d diskfile_mgr.get_diskfile_from_audit_location(obj_path)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def see_object(self, sequence_number, object_metadata,"},{"line_number":94,"context_line":"                   policy_index, partition, df, **other_kwargs):"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # No point in loading the container servers with unnecessary requests."}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_3f9b5d17","line":93,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E301 expected 1 blank line, found 0","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        if obj_info is None:"},{"line_number":126,"context_line":"            self.tot_dark +\u003d 1"},{"line_number":127,"context_line":"            self.policy_based_object_handling(df) #opj_path"},{"line_number":128,"context_line":"        else:"},{"line_number":129,"context_line":"            # OK, object is there, but we need to verify that we are what"},{"line_number":130,"context_line":"            # is listed. Watch out for versioned objects, EC, and all that."}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_1fa01942","line":127,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E261 at least two spaces before inline comment","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        if obj_info is None:"},{"line_number":126,"context_line":"            self.tot_dark +\u003d 1"},{"line_number":127,"context_line":"            self.policy_based_object_handling(df) #opj_path"},{"line_number":128,"context_line":"        else:"},{"line_number":129,"context_line":"            # OK, object is there, but we need to verify that we are what"},{"line_number":130,"context_line":"            # is listed. Watch out for versioned objects, EC, and all that."}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_7f8835c5","line":127,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E262 inline comment should start with \u0027# \u0027","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7bcbdb172bde22b2b5299dd41acaf3564edfa800","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        swift_dir \u003d \u0027/etc/swift\u0027"},{"line_number":54,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":55,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":56,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":57,"context_line":"            self.logger.warning(\"Dark data action defaults to action \u003d \u0027log\u0027\")"},{"line_number":58,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_eb8335a8","line":55,"updated":"2020-10-27 06:18:13.000000000","message":"NIT: Should we add action to the Example conf comment above?\n\nTo take it a step further, we should add a doc str to the class and then maybe make a watchers section that pulls these docs strings into the upstream doc.\n\nHappy for this to be a follow up patch, because this one has probably gone on long enough, I mean 37 patchsets!.\n\nI\u0027m happy to poke around at getting this done (the docs) later.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        swift_dir \u003d \u0027/etc/swift\u0027"},{"line_number":54,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":55,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":56,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":57,"context_line":"            self.logger.warning(\"Dark data action defaults to action \u003d \u0027log\u0027\")"},{"line_number":58,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_e3298a9b","line":55,"in_reply_to":"3f65232a_eb8335a8","updated":"2020-10-28 03:50:48.000000000","message":"I was actually thinking about dropping those examples in the comments, precisely because they may quickly diverge from the reality.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # /AUTH_zaitcev/ec1cont/bg_yukiho.png"},{"line_number":95,"context_line":"        obj_path \u003d object_metadata[\u0027name\u0027]"},{"line_number":96,"context_line":"        for key, value in object_metadata.items():"},{"line_number":97,"context_line":"            self.logger.info(\"dark object_metadata %s-\u003e%s\" % (key, value,))"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            obj_info \u003d get_info_1(self.container_ring, obj_path, self.logger)"},{"line_number":100,"context_line":"        except ContainerError:"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_0e5af54d","line":97,"range":{"start_line":96,"start_character":8,"end_line":97,"end_character":75},"updated":"2020-10-27 18:07:51.000000000","message":"This seems a bit noisy -- was it mainly for debugging/testing?","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # /AUTH_zaitcev/ec1cont/bg_yukiho.png"},{"line_number":95,"context_line":"        obj_path \u003d object_metadata[\u0027name\u0027]"},{"line_number":96,"context_line":"        for key, value in object_metadata.items():"},{"line_number":97,"context_line":"            self.logger.info(\"dark object_metadata %s-\u003e%s\" % (key, value,))"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            obj_info \u003d get_info_1(self.container_ring, obj_path, self.logger)"},{"line_number":100,"context_line":"        except ContainerError:"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_15183973","line":97,"range":{"start_line":96,"start_character":8,"end_line":97,"end_character":75},"in_reply_to":"3f65232a_0e5af54d","updated":"2020-10-28 03:50:48.000000000","message":"I agree, this \"key-\u003evalue\" at info level needs to be dropped.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        raise ContainerError()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # Perhaps we should do something about the way we select the container"},{"line_number":148,"context_line":"    # nodes. For now we just shuffle. Better than nothing, but in case some"},{"line_number":149,"context_line":"    # nodes are down, auditor slows to a crawl (if this plugin is enabled)."},{"line_number":150,"context_line":"    random.shuffle(container_nodes)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    dark_flag \u003d 0"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_710c283b","line":149,"range":{"start_line":148,"start_character":63,"end_line":149,"end_character":46},"updated":"2020-10-27 18:07:51.000000000","message":"\u0027cause of the 5s connect timeout and 15s response timeout, yeah? Should we expose those as config options?\n\nFine as a future patch, though.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        raise ContainerError()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # Perhaps we should do something about the way we select the container"},{"line_number":148,"context_line":"    # nodes. For now we just shuffle. Better than nothing, but in case some"},{"line_number":149,"context_line":"    # nodes are down, auditor slows to a crawl (if this plugin is enabled)."},{"line_number":150,"context_line":"    random.shuffle(container_nodes)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    dark_flag \u003d 0"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_55875162","line":149,"range":{"start_line":148,"start_character":63,"end_line":149,"end_character":46},"in_reply_to":"3f65232a_710c283b","updated":"2020-10-28 03:50:48.000000000","message":"Shuffling isn\u0027t going to make the dead nodes to come up. It\u0027s only there to prevent the auditor from hammering the same container node all the time. The comment is perhaps a little misleading. I\u0027ll accept a better formulation gladly.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"}],"swift/obj/auditor.py":[{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a619d00daf844809877431f67da548a763d83188","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            [(s, 0) for s in self.stats_sizes + [\u0027OVER\u0027]])"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.watchers \u003d [WatcherWrapper(watcher_class, conf, logger)"},{"line_number":101,"context_line":"                         for watcher_class in watcher_classes]"},{"line_number":102,"context_line":"        logger.debug(\"%d audit watcher(s) loaded\", len(self.watchers))"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def create_recon_nested_dict(self, top_level_key, device_list, item):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_6b0cbeeb","line":101,"updated":"2020-03-06 18:15:13.000000000","message":"Could add a small sanity check to avoid duplicate. I think a set() should do it:\nfor watcher_class in set(watcher_classes)]","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0de39a324a94eb9b1f693ba832ee1200aa4e45c3","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            [(s, 0) for s in self.stats_sizes + [\u0027OVER\u0027]])"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        self.watchers \u003d [WatcherWrapper(watcher_class, conf, logger)"},{"line_number":101,"context_line":"                         for watcher_class in watcher_classes]"},{"line_number":102,"context_line":"        logger.debug(\"%d audit watcher(s) loaded\", len(self.watchers))"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def create_recon_nested_dict(self, top_level_key, device_list, item):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_eb6160d4","line":101,"in_reply_to":"1fa4df85_6b0cbeeb","updated":"2020-03-09 23:56:07.000000000","message":"I added a set() around watcher_names[] instead.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a619d00daf844809877431f67da548a763d83188","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                obj_size \u003d int(metadata[\u0027Content-Length\u0027])"},{"line_number":258,"context_line":"                if self.stats_sizes:"},{"line_number":259,"context_line":"                    self.record_stats(obj_size)"},{"line_number":260,"context_line":"                for watcher in self.watchers:"},{"line_number":261,"context_line":"                    # Just pass the policy index, not the whole policy. A"},{"line_number":262,"context_line":"                    # policy has an associated ring, and a serialized ring"},{"line_number":263,"context_line":"                    # can be rather large (i.e. tens of megabytes), so we"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_b87af8b6","line":260,"updated":"2020-03-06 18:15:13.000000000","message":"I think it should be done later, after auditor check the data. There is no point in handling an object that will be quarantined","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0de39a324a94eb9b1f693ba832ee1200aa4e45c3","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                obj_size \u003d int(metadata[\u0027Content-Length\u0027])"},{"line_number":258,"context_line":"                if self.stats_sizes:"},{"line_number":259,"context_line":"                    self.record_stats(obj_size)"},{"line_number":260,"context_line":"                for watcher in self.watchers:"},{"line_number":261,"context_line":"                    # Just pass the policy index, not the whole policy. A"},{"line_number":262,"context_line":"                    # policy has an associated ring, and a serialized ring"},{"line_number":263,"context_line":"                    # can be rather large (i.e. tens of megabytes), so we"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_ebbde001","line":260,"in_reply_to":"1fa4df85_b87af8b6","updated":"2020-03-09 23:56:07.000000000","message":"This is taken verbatim from Sam\u0027s version. If I start moving the call site around, we\u0027re no longer compatible. But okay, let\u0027s do it.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a619d00daf844809877431f67da548a763d83188","unresolved":false,"context_lines":[{"line_number":476,"context_line":"    in the plugins."},{"line_number":477,"context_line":"    \"\"\""},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def __init__(self, watcher_class, conf, logger, max_queue_size\u003d256):"},{"line_number":480,"context_line":"        # max_queue_size is unusued, obviously"},{"line_number":481,"context_line":"        self.sequence_number \u003d None"},{"line_number":482,"context_line":"        self.watcher \u003d watcher_class(conf, logger)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_abd4f620","line":479,"range":{"start_line":479,"start_character":50,"end_line":479,"end_character":70},"updated":"2020-03-06 18:15:13.000000000","message":"unused","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0de39a324a94eb9b1f693ba832ee1200aa4e45c3","unresolved":false,"context_lines":[{"line_number":476,"context_line":"    in the plugins."},{"line_number":477,"context_line":"    \"\"\""},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def __init__(self, watcher_class, conf, logger, max_queue_size\u003d256):"},{"line_number":480,"context_line":"        # max_queue_size is unusued, obviously"},{"line_number":481,"context_line":"        self.sequence_number \u003d None"},{"line_number":482,"context_line":"        self.watcher \u003d watcher_class(conf, logger)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_0b8b9c67","line":479,"range":{"start_line":479,"start_character":50,"end_line":479,"end_character":70},"in_reply_to":"1fa4df85_abd4f620","updated":"2020-03-09 23:56:07.000000000","message":"Yes, there\u0027s a comment about it at the next line.\n\nI can drop it, but I meant to keep it the same as was in Sam\u0027s API, so we could return to isolation if a need arises. I suppose it can be a key in conf{} when that time comes.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":13852,"name":"Romain LE DISEZ","email":"romain.le-disez@corp.ovh.com","username":"rledisez"},"change_message_id":"a619d00daf844809877431f67da548a763d83188","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        self.watcher.start(audit_type\u003daudit_type)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def see_object(self, meta, policy_index, partition):"},{"line_number":489,"context_line":"        self.sequence_number +\u003d 1"},{"line_number":490,"context_line":"        kwargs \u003d {\u0027metadata\u0027: meta,"},{"line_number":491,"context_line":"                  \u0027storage_policy_index\u0027: policy_index,"},{"line_number":492,"context_line":"                  \u0027partition\u0027: partition,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_d862540a","line":489,"updated":"2020-03-06 18:15:13.000000000","message":"I\u0027d like a try/except here so that a buggy watcher does not totally break the auditor.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0de39a324a94eb9b1f693ba832ee1200aa4e45c3","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        self.watcher.start(audit_type\u003daudit_type)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def see_object(self, meta, policy_index, partition):"},{"line_number":489,"context_line":"        self.sequence_number +\u003d 1"},{"line_number":490,"context_line":"        kwargs \u003d {\u0027metadata\u0027: meta,"},{"line_number":491,"context_line":"                  \u0027storage_policy_index\u0027: policy_index,"},{"line_number":492,"context_line":"                  \u0027partition\u0027: partition,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_cbd7c44a","line":489,"in_reply_to":"1fa4df85_d862540a","updated":"2020-03-09 23:56:07.000000000","message":"See the failsafe_xxxxx(). Let\u0027s rely on the watcher invoked after the auditing, if a specific object somehow triggers a fault.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":239,"context_line":"                watcher.start(self.auditor_type)"},{"line_number":240,"context_line":"        except (Exception, Timeout):"},{"line_number":241,"context_line":"            self.logger.increment(\u0027errors\u0027)"},{"line_number":242,"context_line":"            self.errors +\u003d 1"},{"line_number":243,"context_line":"            self.logger.exception(_(\u0027ERROR Trying to start watchers\u0027))"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def failsafe_watch_end(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_8eb23293","line":242,"updated":"2020-06-01 19:45:58.000000000","message":"I\u0027m not sure about the error incrementing here -- currently the errors metric is tied to objects visited; on master, self.errors \u003c\u003d self.total_files_processed always. Maybe logging with the traceback is enough? *shrug*","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        except (Exception, Timeout):"},{"line_number":250,"context_line":"            self.logger.increment(\u0027errors\u0027)"},{"line_number":251,"context_line":"            self.errors +\u003d 1"},{"line_number":252,"context_line":"            self.logger.exception(_(\u0027ERROR Trying to end watchers\u0027))"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def object_audit(self, location):"},{"line_number":255,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_b8bf80a8","line":252,"updated":"2020-06-01 19:45:58.000000000","message":"I wonder if these should be more like\n\n for watcher in self.watchers:\n     try:\n         ...\n     except:\n         ...\n\nso a failure in one watcher doesn\u0027t impact subsequent watchers. Alternatively, maybe the WatcherWrapper class should be responsible for making things more fail-safe?","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                # child process small. Well, we don\u0027t have a separation"},{"line_number":294,"context_line":"                # process anymore, but it\u0027s a sensible API, so we kept it."},{"line_number":295,"context_line":"                watcher.see_object(metadata, location.policy.idx,"},{"line_number":296,"context_line":"                                   int(location.partition))"},{"line_number":297,"context_line":"        except DiskFileQuarantined as err:"},{"line_number":298,"context_line":"            self.quarantines +\u003d 1"},{"line_number":299,"context_line":"            self.logger.error(_(\u0027ERROR Object %(obj)s failed audit and was\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_f830d858","line":296,"updated":"2020-06-01 19:45:58.000000000","message":"So if one watcher bombs out in see_object, no other watchers will see it?","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def __init__(self, watcher_class, conf, logger):"},{"line_number":496,"context_line":"        self.sequence_number \u003d None"},{"line_number":497,"context_line":"        self.watcher \u003d watcher_class(conf, logger)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def start(self, audit_type):"},{"line_number":500,"context_line":"        self.sequence_number \u003d 0"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_2ef5e6ed","line":497,"range":{"start_line":497,"start_character":43,"end_line":497,"end_character":49},"updated":"2020-06-01 19:45:58.000000000","message":"I rather liked the PrefixLoggerAdapter I\u0027d put in the other patch -- might be worth carrying over here so the watchers don\u0027t have to think about how to distinguish their log lines from other watchers\u0027 logs.","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b726a439d67f9155acb2f8e1db967ac846ec0081","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\"Walk through file system to audit objects\"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self, conf, logger, rcache, devices, zero_byte_only_at_fps\u003d0,"},{"line_number":42,"context_line":"                 watcher_classes\u003d{}):"},{"line_number":43,"context_line":"        self.conf \u003d conf"},{"line_number":44,"context_line":"        self.logger \u003d logger"},{"line_number":45,"context_line":"        self.devices \u003d devices"}],"source_content_type":"text/x-python","patch_set":21,"id":"bf51134e_41d3d3d5","line":42,"updated":"2020-07-09 19:58:14.000000000","message":"Oops, my mistake. But, it was None for a reason. We don\u0027t use mutable defaults out of abundance of caution, even if we know the code inside the function isn\u0027t modifying the arguments. I\u0027ll fix this up.","commit_id":"a4ab7d873eef67a03b10174462b38701467fc38b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"acdf5a1b205e60776f384437742a1f10fcc24ae4","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                # pass just the index so we can keep the messages to our"},{"line_number":280,"context_line":"                # child process small. Well, we don\u0027t have a separation"},{"line_number":281,"context_line":"                # process anymore, but it\u0027s a sensible API, so we kept it."},{"line_number":282,"context_line":"                watcher.see_object(metadata, location.policy.idx,"},{"line_number":283,"context_line":"                                   int(location.partition))"},{"line_number":284,"context_line":"        except DiskFileQuarantined as err:"},{"line_number":285,"context_line":"            self.quarantines +\u003d 1"}],"source_content_type":"text/x-python","patch_set":28,"id":"9f560f44_e4786c2b","line":282,"range":{"start_line":282,"start_character":24,"end_line":282,"end_character":34},"updated":"2020-07-30 23:21:23.000000000","message":"I\u0027m realizing we probably want this to send most (if not all) of the info from the audit location... though maybe we switch df._data_file for path...","commit_id":"97d22ac51c32b275f80ea1fc371de33026615837"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"5aad49f7b23be42675a45a127d679240c1dd9c22","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                # child process small. Well, we don\u0027t have a separation"},{"line_number":281,"context_line":"                # process anymore, but it\u0027s a sensible API, so we kept it."},{"line_number":282,"context_line":"                watcher.see_object(metadata, location.policy.idx,"},{"line_number":283,"context_line":"                                   int(location.partition), df)"},{"line_number":284,"context_line":"        except DiskFileQuarantined as err:"},{"line_number":285,"context_line":"            self.quarantines +\u003d 1"},{"line_number":286,"context_line":"            self.logger.error(_(\u0027ERROR Object %(obj)s failed audit and was\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_add627f1","line":283,"updated":"2020-09-07 19:46:09.000000000","message":"I don\u0027t mind adding df to the list of arguments too much. Let\u0027s live with it for now and point out for Tim \u0026 Romain for the final round of reviews.","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        kwargs \u003d {\u0027object_metadata\u0027: meta,"},{"line_number":516,"context_line":"                  \u0027policy_index\u0027: policy_index,"},{"line_number":517,"context_line":"                  \u0027partition\u0027: partition,"},{"line_number":518,"context_line":"                  \u0027sequence_number\u0027: self.sequence_number,"},{"line_number":519,"context_line":"                  \u0027df\u0027: df}"},{"line_number":520,"context_line":"        try:"},{"line_number":521,"context_line":"            self.watcher.see_object(**kwargs)"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_5081348f","line":518,"updated":"2020-10-27 18:07:51.000000000","message":"Do we still need this? I don\u0027t think it provides much value now that we don\u0027t need to worry about dropped messages...","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        kwargs \u003d {\u0027object_metadata\u0027: meta,"},{"line_number":516,"context_line":"                  \u0027policy_index\u0027: policy_index,"},{"line_number":517,"context_line":"                  \u0027partition\u0027: partition,"},{"line_number":518,"context_line":"                  \u0027sequence_number\u0027: self.sequence_number,"},{"line_number":519,"context_line":"                  \u0027df\u0027: df}"},{"line_number":520,"context_line":"        try:"},{"line_number":521,"context_line":"            self.watcher.see_object(**kwargs)"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_155039d4","line":518,"in_reply_to":"3f65232a_5081348f","updated":"2020-10-28 03:50:48.000000000","message":"The sequence_number is a vestige of Sam\u0027s API, but I forgot to consider just what it was doing. If you see no use case, let\u0027s drop it. I didn\u0027t realize it was to track the loss. I thought it was for some logging.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":526,"context_line":"        except (Exception, Timeout):"},{"line_number":527,"context_line":"            self.logger.exception("},{"line_number":528,"context_line":"                \u0027Error in see_object(meta\u003d%r, policy_index\u003d%r, partition\u003d%r)\u0027,"},{"line_number":529,"context_line":"                meta, policy_index, partition)"},{"line_number":530,"context_line":"            # Do *not* flag watcher as being in an error state; a failure"},{"line_number":531,"context_line":"            # to process one object shouldn\u0027t impact the ability to process"},{"line_number":532,"context_line":"            # others."}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_68c6004b","line":529,"updated":"2020-10-27 18:07:51.000000000","message":"Should this message maybe include the diskfile path?","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":526,"context_line":"        except (Exception, Timeout):"},{"line_number":527,"context_line":"            self.logger.exception("},{"line_number":528,"context_line":"                \u0027Error in see_object(meta\u003d%r, policy_index\u003d%r, partition\u003d%r)\u0027,"},{"line_number":529,"context_line":"                meta, policy_index, partition)"},{"line_number":530,"context_line":"            # Do *not* flag watcher as being in an error state; a failure"},{"line_number":531,"context_line":"            # to process one object shouldn\u0027t impact the ability to process"},{"line_number":532,"context_line":"            # others."}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_95128908","line":529,"in_reply_to":"3f65232a_68c6004b","updated":"2020-10-28 03:50:48.000000000","message":"Probably. That meta is also too long.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":534,"context_line":"    def end(self):"},{"line_number":535,"context_line":"        if self.watcher_in_error:"},{"line_number":536,"context_line":"            return  # can\u0027t trust the state of the thing; bail"},{"line_number":537,"context_line":"        kwargs \u003d {\u0027final_sequence_number\u0027: self.sequence_number}"},{"line_number":538,"context_line":"        try:"},{"line_number":539,"context_line":"            self.watcher.end(**kwargs)"},{"line_number":540,"context_line":"        except (Exception, Timeout):"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_904c6c9f","line":537,"updated":"2020-10-27 18:07:51.000000000","message":"Similar to above; do we (still) need this?","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9b06dcd905fdcedd97f07b553e7759fed0b25bb","unresolved":true,"context_lines":[{"line_number":199,"context_line":"                \u0027brate\u0027: self.total_bytes_processed / elapsed,"},{"line_number":200,"context_line":"                \u0027audit\u0027: time_auditing, \u0027audit_rate\u0027: time_auditing / elapsed})"},{"line_number":201,"context_line":"        for watcher in self.watchers:"},{"line_number":202,"context_line":"            watcher.end()"},{"line_number":203,"context_line":"        if self.stats_sizes:"},{"line_number":204,"context_line":"            self.logger.info("},{"line_number":205,"context_line":"                _(\u0027Object audit stats: %s\u0027) % json.dumps(self.stats_buckets))"}],"source_content_type":"text/x-python","patch_set":40,"id":"7bfd56e6_03dec92b","line":202,"updated":"2020-12-10 23:21:53.000000000","message":"This is an end()... per-worker, right? Is there any good place to do watcher stat aggregation across workers, akin to the replicator\u0027s aggregate_recon_update? https://github.com/openstack/swift/blob/2.26.0/swift/obj/replicator.py#L1025-L1053\n\nThough come to think of it, it looks like the auditor doesn\u0027t have any such functionality (yet) for its own recon stats, so I\u0027m willing to bet the answer is \"Nope, out of luck.\"\n\nMaybe we could at least pass watchers the device_key here that we make up in create_recon_nested_dict? Then they could manage dropping stats per-worker, rather than having all the workers overwriting each other with partial data.","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0b1869e0936b55107133129be8e8f31b7f79bf38","unresolved":true,"context_lines":[{"line_number":278,"context_line":"                # can be rather large (i.e. tens of megabytes), so we"},{"line_number":279,"context_line":"                # pass just the index so we can keep the messages to our"},{"line_number":280,"context_line":"                # child process small. Well, we don\u0027t have a separation"},{"line_number":281,"context_line":"                # process anymore, but it\u0027s a sensible API, so we kept it."},{"line_number":282,"context_line":"                watcher.see_object(metadata, location.policy.idx,"},{"line_number":283,"context_line":"                                   int(location.partition), df)"},{"line_number":284,"context_line":"        except DiskFileQuarantined as err:"}],"source_content_type":"text/x-python","patch_set":40,"id":"07166e9a_91ce0126","line":281,"updated":"2020-11-26 08:54:27.000000000","message":"We could load just the metadata component of the ring. We have that ability in RingBuilder, but it is\u0027nt piped through to Ring... but having said that.. that\u0027s still too much data to send to watchers, so I\u0027m 100% ok with this as it is.\nJust an FYI for the furture if we ever come up with a great watcher that really needs it in the future.","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"022e3c118e8c4229bd1ce582927c3598f090dcf3","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                # can be rather large (i.e. tens of megabytes), so we"},{"line_number":279,"context_line":"                # pass just the index so we can keep the messages to our"},{"line_number":280,"context_line":"                # child process small. Well, we don\u0027t have a separation"},{"line_number":281,"context_line":"                # process anymore, but it\u0027s a sensible API, so we kept it."},{"line_number":282,"context_line":"                watcher.see_object(metadata, location.policy.idx,"},{"line_number":283,"context_line":"                                   int(location.partition), df)"},{"line_number":284,"context_line":"        except DiskFileQuarantined as err:"}],"source_content_type":"text/x-python","patch_set":40,"id":"955f1119_9b860e31","line":281,"in_reply_to":"07166e9a_91ce0126","updated":"2020-11-26 20:16:06.000000000","message":"Ack","commit_id":"46a22c5e024a60162c223c9059e13635126a0d13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"117fef8e03b47c814875567cffd64738064e7e9b","unresolved":true,"context_lines":[{"line_number":337,"context_line":"            wconf.update(watcher_configs.get(name, {}))"},{"line_number":338,"context_line":"            self.watcher_defs[name] \u003d {"},{"line_number":339,"context_line":"                \u0027conf\u0027: wconf,"},{"line_number":340,"context_line":"                \u0027klass\u0027: load_pkg_resource(\"swift.object_audit_watcher\", name)}"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def _sleep(self):"},{"line_number":343,"context_line":"        time.sleep(self.interval)"}],"source_content_type":"text/x-python","patch_set":42,"id":"fa776139_bfa84a8c","line":340,"updated":"2020-12-10 06:35:00.000000000","message":"I wonder if we should issue errors (or at least warnings) for watcher configs that aren\u0027t actually going to get used...\n\nI could see someone burning a lot of time trying to figure out why things are misbehaving just to ultimately track it down to\n\n [object-auditor:watcher:swift#dark_daat]\n\n(Conversely, it wouldn\u0027t help at all if the typo was\n\n [object-auditor:wacther:swift#dark_data]\n\nso... maybe it doesn\u0027t really matter?)","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"994cc075c5e25fca3aee2ca7cb220326c04bde58","unresolved":true,"context_lines":[{"line_number":337,"context_line":"            wconf.update(watcher_configs.get(name, {}))"},{"line_number":338,"context_line":"            self.watcher_defs[name] \u003d {"},{"line_number":339,"context_line":"                \u0027conf\u0027: wconf,"},{"line_number":340,"context_line":"                \u0027klass\u0027: load_pkg_resource(\"swift.object_audit_watcher\", name)}"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def _sleep(self):"},{"line_number":343,"context_line":"        time.sleep(self.interval)"}],"source_content_type":"text/x-python","patch_set":42,"id":"0049470e_d3d41635","line":340,"in_reply_to":"fa776139_bfa84a8c","updated":"2020-12-10 16:31:59.000000000","message":"At least the debug log shows the name. Personally I don\u0027t see much that can be improved here.","commit_id":"c981baefae6e6be50d8642cbb430437789373742"}],"swift/obj/watchers/dark_data.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f782dd637936ca4acd29b3ac905c8a6e453ea538","unresolved":true,"context_lines":[{"line_number":78,"context_line":"        if self.is_zbf:"},{"line_number":79,"context_line":"            return"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        # /AUTH_zaitcev/ec1cont/bg_yukiho.png"},{"line_number":82,"context_line":"        obj_path \u003d object_metadata[\u0027name\u0027]"},{"line_number":83,"context_line":"        try:"},{"line_number":84,"context_line":"            obj_info \u003d get_info_1(self.container_ring, obj_path, self.logger)"}],"source_content_type":"text/x-python","patch_set":41,"id":"6bdd963d_40c8c56f","line":81,"updated":"2020-12-02 09:20:45.000000000","message":"Do we still need this comment? Seems redundant.","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"38157d98b0247fb9496abc84e31a157fba490a31","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        if self.is_zbf:"},{"line_number":79,"context_line":"            return"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        # /AUTH_zaitcev/ec1cont/bg_yukiho.png"},{"line_number":82,"context_line":"        obj_path \u003d object_metadata[\u0027name\u0027]"},{"line_number":83,"context_line":"        try:"},{"line_number":84,"context_line":"            obj_info \u003d get_info_1(self.container_ring, obj_path, self.logger)"}],"source_content_type":"text/x-python","patch_set":41,"id":"df70a372_92c3abe9","line":81,"in_reply_to":"6bdd963d_40c8c56f","updated":"2020-12-03 04:36:57.000000000","message":"Done","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f782dd637936ca4acd29b3ac905c8a6e453ea538","unresolved":true,"context_lines":[{"line_number":94,"context_line":"            # more. Watch out for versioned objects, EC, and all that."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            # obj_info[\u0027ip\u0027] \u003d\u003d myip()  \u003c--- wait, we have many replicas"},{"line_number":97,"context_line":"            # hash(info[\u0027path\u0027]) \u003d\u003d obj_hash  \u003c--- isn\u0027t it guaranteed"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            self.tot_okay +\u003d 1"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"199c431a_bf68fd12","line":97,"updated":"2020-12-02 09:20:45.000000000","message":"What are these commented out bits for? Should we remove them, or are they related to something that we may expand into? if the latter for detail would be nice, if the former remove them.\n\nBecause if we\u0027re using this, initially, as example code, then we don\u0027t want to confuse people.","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"38157d98b0247fb9496abc84e31a157fba490a31","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            # more. Watch out for versioned objects, EC, and all that."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            # obj_info[\u0027ip\u0027] \u003d\u003d myip()  \u003c--- wait, we have many replicas"},{"line_number":97,"context_line":"            # hash(info[\u0027path\u0027]) \u003d\u003d obj_hash  \u003c--- isn\u0027t it guaranteed"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"            self.tot_okay +\u003d 1"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"e5ff07db_04393860","line":97,"in_reply_to":"199c431a_bf68fd12","updated":"2020-12-03 04:36:57.000000000","message":"Done","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f47dedb67147c29f73b7bc8bc16b4b324761d2f2","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.logger \u003d logger"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        swift_dir \u003d \u0027/etc/swift\u0027"},{"line_number":47,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":48,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":49,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":50,"context_line":"            self.logger.warning("}],"source_content_type":"text/x-python","patch_set":42,"id":"40b33554_21e12bf6","line":47,"updated":"2020-12-09 09:05:01.000000000","message":"Should we make note in doc somewhere that this requires a copy of the container ring on the object servers? As this may not always be the case.","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"117fef8e03b47c814875567cffd64738064e7e9b","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.logger \u003d logger"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        swift_dir \u003d \u0027/etc/swift\u0027"},{"line_number":47,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":48,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":49,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":50,"context_line":"            self.logger.warning("}],"source_content_type":"text/x-python","patch_set":42,"id":"96d4e8fd_a813e125","line":47,"in_reply_to":"40b33554_21e12bf6","updated":"2020-12-10 06:35:00.000000000","message":"FWIW, object-server already needs a copy of the container ring for the object-updater.","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6da71cc6b10df80f26ccfaf5d8f8aac84cb91959","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.logger \u003d logger"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        swift_dir \u003d \u0027/etc/swift\u0027"},{"line_number":47,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":48,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":49,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":50,"context_line":"            self.logger.warning("}],"source_content_type":"text/x-python","patch_set":42,"id":"2104857f_0c43b042","line":47,"in_reply_to":"40b33554_21e12bf6","updated":"2020-12-10 02:10:04.000000000","message":"You are right, it slipped my mind: my cluster only has P separate, but ACO are together. I hoped to avoid documenting Dark Data watcher specifically in the doc page, but I see now that I must.","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"994cc075c5e25fca3aee2ca7cb220326c04bde58","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.logger \u003d logger"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        swift_dir \u003d \u0027/etc/swift\u0027"},{"line_number":47,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":48,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":49,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":50,"context_line":"            self.logger.warning("}],"source_content_type":"text/x-python","patch_set":42,"id":"853d7b4b_0d84ee6c","line":47,"in_reply_to":"96d4e8fd_a813e125","updated":"2020-12-10 16:31:59.000000000","message":"Wait, I thought object server received a list of servers to update in headers from proxy, so updater never needs to consult the container ring.","commit_id":"c981baefae6e6be50d8642cbb430437789373742"}],"test/probe/test_dark_data.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"ea0bf201a32deb0173ac4a39705b98d728b83605","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"import uuid"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"# TODO remove undesired imports"},{"line_number":24,"context_line":"from swift.common.direct_client import direct_get_suffix_hashes"},{"line_number":25,"context_line":"from swift.common.exceptions import DiskFileDeleted"},{"line_number":26,"context_line":"from swift.common.internal_client import UnexpectedResponse"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_ab1b967e","line":23,"updated":"2020-03-06 00:45:54.000000000","message":"tox -e pep8  tells you if any are unused, so there\u0027s no need to worry too much.\n\nOr, did you mean to get rid of BrainSplitter and use the client directly? That would let you drop some imports.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"ea0bf201a32deb0173ac4a39705b98d728b83605","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.brain \u003d BrainSplitter(self.url, self.token, self.container_name,"},{"line_number":49,"context_line":"                                   self.object_name, \u0027object\u0027,"},{"line_number":50,"context_line":"                                   policy\u003dself.policy)"},{"line_number":51,"context_line":"        self.container_brain \u003d BrainSplitter(self.url, self.token,"},{"line_number":52,"context_line":"                                             self.container_name)"},{"line_number":53,"context_line":"        self.int_client \u003d self.make_internal_client()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_c190334d","line":51,"updated":"2020-03-06 00:45:54.000000000","message":"container_brain is unused","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"ea0bf201a32deb0173ac4a39705b98d728b83605","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        db_conn \u003d connect(db_file)"},{"line_number":100,"context_line":"        cur \u003d db_conn.cursor()"},{"line_number":101,"context_line":"        # TODO add try catch"},{"line_number":102,"context_line":"        cur.execute(\u0027UPDATE container_stat SET reported_object_count \u003d 0\u0027)"},{"line_number":103,"context_line":"        # import pdb; pdb.set_trace()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        db \u003d ContainerBroker(db_file)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fa4df85_c19b5315","line":102,"updated":"2020-03-06 00:45:54.000000000","message":"I suspect you wanted this in _update_container_db.\nAlso, it\u0027s a good time to use a transaction with commit:\ndelete the object entry and update the stats in one go.","commit_id":"4c8e48c91cc476e83c5e606062bb9327b3ef7e3a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3d51117a69c8b6eef140baa3e09d31f4a679e44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"ff570b3c_396d4b32","updated":"2020-05-30 05:28:06.000000000","message":"FWIW, I had pretty good luck with a probe test along the lines of http://paste.openstack.org/show/794164/ -- though there are a couple problems:\n\n* It demonstrates only one of at least two ways you can get dark data: tombstone got reaped then an old disk got reintroduced to the cluster. But you can get dark data without any DELETEs, too -- if all the container servers were all unavailable during the PUT, the object servers all write down async pendings. If the updaters are *really* backlogged, none of those updates land within a reclaim window and we unlink the async pending.\n\n* Since the watcher currently only logs about dark data, it\u0027s difficult to test that it was properly identified. Maybe if we had the watcher also write the top N largest bits of dark data to recon it\u0027d be something easier to verify?","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":27,"context_line":"# from swift.common.internal_client import UnexpectedResponse"},{"line_number":28,"context_line":"from swift.common.ring import Ring"},{"line_number":29,"context_line":"from swift.common.storage_policy import POLICIES"},{"line_number":30,"context_line":"from swift.container.backend import ContainerBroker"},{"line_number":31,"context_line":"from swift.obj.diskfile import DiskFileManager"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"from test.probe.brain import BrainSplitter"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_1dfc536e","line":30,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: F401 \u0027swift.container.backend.ContainerBroker\u0027 imported but unused","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":36,"context_line":"from sqlite3 import connect"},{"line_number":37,"context_line":"from swiftclient import client"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"from swift.common.manager import Manager"},{"line_number":40,"context_line":"from swift.common.utils import readconf"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_fdf6bf8e","line":39,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: F401 \u0027swift.common.manager.Manager\u0027 imported but unused","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":37,"context_line":"from swiftclient import client"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"from swift.common.manager import Manager"},{"line_number":40,"context_line":"from swift.common.utils import readconf"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class Test(ReplProbeTest):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_5df24b9b","line":40,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: F401 \u0027swift.common.utils.readconf\u0027 imported but unused","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        # TODO add try catch"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # to avoid verifications imposed by .schema for object table"},{"line_number":107,"context_line":"        cur.execute(\u0027DROP TRIGGER object_insert_policy_stat\u0027)"},{"line_number":108,"context_line":"        from nose.tools import set_trace; set_trace()"},{"line_number":109,"context_line":"        # add dark data object record"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_3dedd7b6","line":106,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # to avoid verifications imposed by .schema for object table"},{"line_number":107,"context_line":"        cur.execute(\u0027DROP TRIGGER object_insert_policy_stat\u0027)"},{"line_number":108,"context_line":"        from nose.tools import set_trace; set_trace()"},{"line_number":109,"context_line":"        # add dark data object record"},{"line_number":110,"context_line":"        sqlite_insert_query \u003d \"\"\"INSERT INTO object "},{"line_number":111,"context_line":"                                           (ROWID, name, created_at, size, content_type, etag)  "}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_9d2d0300","line":108,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E702 multiple statements on one line (semicolon)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        cur.execute(\u0027DROP TRIGGER object_insert_policy_stat\u0027)"},{"line_number":108,"context_line":"        from nose.tools import set_trace; set_trace()"},{"line_number":109,"context_line":"        # add dark data object record"},{"line_number":110,"context_line":"        sqlite_insert_query \u003d \"\"\"INSERT INTO object "},{"line_number":111,"context_line":"                                           (ROWID, name, created_at, size, content_type, etag)  "},{"line_number":112,"context_line":"                                        VALUES        "},{"line_number":113,"context_line":"                                           (\"1\", \"foo\", \"10-10-2020\", \"3\", \"raw\", \"foo\")\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_7d30ef56","line":110,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: W291 trailing whitespace","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        from nose.tools import set_trace; set_trace()"},{"line_number":109,"context_line":"        # add dark data object record"},{"line_number":110,"context_line":"        sqlite_insert_query \u003d \"\"\"INSERT INTO object "},{"line_number":111,"context_line":"                                           (ROWID, name, created_at, size, content_type, etag)  "},{"line_number":112,"context_line":"                                        VALUES        "},{"line_number":113,"context_line":"                                           (\"1\", \"foo\", \"10-10-2020\", \"3\", \"raw\", \"foo\")\"\"\""},{"line_number":114,"context_line":"        cur.execute(sqlite_insert_query);"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_dd33fb60","line":111,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E501 line too long (94 \u003e 79 characters)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        from nose.tools import set_trace; set_trace()"},{"line_number":109,"context_line":"        # add dark data object record"},{"line_number":110,"context_line":"        sqlite_insert_query \u003d \"\"\"INSERT INTO object "},{"line_number":111,"context_line":"                                           (ROWID, name, created_at, size, content_type, etag)  "},{"line_number":112,"context_line":"                                        VALUES        "},{"line_number":113,"context_line":"                                           (\"1\", \"foo\", \"10-10-2020\", \"3\", \"raw\", \"foo\")\"\"\""},{"line_number":114,"context_line":"        cur.execute(sqlite_insert_query);"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_bd360750","line":111,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: W291 trailing whitespace","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        # add dark data object record"},{"line_number":110,"context_line":"        sqlite_insert_query \u003d \"\"\"INSERT INTO object "},{"line_number":111,"context_line":"                                           (ROWID, name, created_at, size, content_type, etag)  "},{"line_number":112,"context_line":"                                        VALUES        "},{"line_number":113,"context_line":"                                           (\"1\", \"foo\", \"10-10-2020\", \"3\", \"raw\", \"foo\")\"\"\""},{"line_number":114,"context_line":"        cur.execute(sqlite_insert_query);"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_1d41f3a9","line":112,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: W291 trailing whitespace","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        sqlite_insert_query \u003d \"\"\"INSERT INTO object "},{"line_number":111,"context_line":"                                           (ROWID, name, created_at, size, content_type, etag)  "},{"line_number":112,"context_line":"                                        VALUES        "},{"line_number":113,"context_line":"                                           (\"1\", \"foo\", \"10-10-2020\", \"3\", \"raw\", \"foo\")\"\"\""},{"line_number":114,"context_line":"        cur.execute(sqlite_insert_query);"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_fd3b5f34","line":113,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E501 line too long (91 \u003e 79 characters)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                                           (ROWID, name, created_at, size, content_type, etag)  "},{"line_number":112,"context_line":"                                        VALUES        "},{"line_number":113,"context_line":"                                           (\"1\", \"foo\", \"10-10-2020\", \"3\", \"raw\", \"foo\")\"\"\""},{"line_number":114,"context_line":"        cur.execute(sqlite_insert_query);"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # cur.execute(\u0027UPDATE container_stat SET reported_object_count \u003d 0\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_5d47ebbc","line":114,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E703 statement ends with a semicolon","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        cur.execute(sqlite_insert_query);"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # cur.execute(\u0027UPDATE container_stat SET reported_object_count \u003d 0\u0027)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        cur.close()"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_3d42f7ab","line":117,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        # cur.execute(\u0027UPDATE container_stat SET reported_object_count \u003d 0\u0027)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        cur.close()"},{"line_number":121,"context_line":"        db_conn.commit() # commit the change"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_9d16a3a7","line":120,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        cur.close()"},{"line_number":121,"context_line":"        db_conn.commit() # commit the change"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # db \u003d ContainerBroker(db_file)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_7d190fd5","line":121,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E261 at least two spaces before inline comment","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        db_conn.commit() # commit the change"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # db \u003d ContainerBroker(db_file)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _update_container_db(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_dd0c9b95","line":124,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        # db \u003d ContainerBroker(db_file)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _update_container_db(self):"},{"line_number":128,"context_line":"        self._update_object_table(self.account, self.container_name)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def _assert_object_metadata_matches_listing(self, listing, metadata):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_bd0f2786","line":127,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        self._update_container_db()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # update configuration to enable dark_data_watcher"},{"line_number":178,"context_line":"\u0027\u0027\u0027        stub_config \u003d \"\"\""},{"line_number":179,"context_line":"                [object-replicator]"},{"line_number":180,"context_line":"                [object-auditor]"},{"line_number":181,"context_line":"                reclaim_age \u003d 60"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_1d2a93d9","line":178,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        # Start object auditor service"},{"line_number":200,"context_line":"        # Manager([\u0027object-auditor\u0027]) is not working and os.command is not used in probe tests"},{"line_number":201,"context_line":"        # TODO: check if can be used"},{"line_number":202,"context_line":"        # os.command(\"swift-init start object-auditor\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_fd24ff0e","line":199,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E116 unexpected indentation (comment)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        # Start object auditor service"},{"line_number":200,"context_line":"        # Manager([\u0027object-auditor\u0027]) is not working and os.command is not used in probe tests"},{"line_number":201,"context_line":"        # TODO: check if can be used"},{"line_number":202,"context_line":"        # os.command(\"swift-init start object-auditor\")"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_5d208bf7","line":199,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E303 too many blank lines (3)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        # Start object auditor service"},{"line_number":200,"context_line":"        # Manager([\u0027object-auditor\u0027]) is not working and os.command is not used in probe tests"},{"line_number":201,"context_line":"        # TODO: check if can be used"},{"line_number":202,"context_line":"        # os.command(\"swift-init start object-auditor\")"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_3d1b17ca","line":200,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E116 unexpected indentation (comment)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        # Start object auditor service"},{"line_number":200,"context_line":"        # Manager([\u0027object-auditor\u0027]) is not working and os.command is not used in probe tests"},{"line_number":201,"context_line":"        # TODO: check if can be used"},{"line_number":202,"context_line":"        # os.command(\"swift-init start object-auditor\")"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_9d7b43f3","line":200,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E501 line too long (94 \u003e 79 characters)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        # Start object auditor service"},{"line_number":200,"context_line":"        # Manager([\u0027object-auditor\u0027]) is not working and os.command is not used in probe tests"},{"line_number":201,"context_line":"        # TODO: check if can be used"},{"line_number":202,"context_line":"        # os.command(\"swift-init start object-auditor\")"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # And verify that the policy was applied"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_7d7e2fe4","line":201,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E116 unexpected indentation (comment)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        # Start object auditor service"},{"line_number":200,"context_line":"        # Manager([\u0027object-auditor\u0027]) is not working and os.command is not used in probe tests"},{"line_number":201,"context_line":"        # TODO: check if can be used"},{"line_number":202,"context_line":"        # os.command(\"swift-init start object-auditor\")"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # And verify that the policy was applied"},{"line_number":205,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_dd813bc5","line":202,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E116 unexpected indentation (comment)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"873a59e441ce717ee13271595e23ffd24cceb915","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        # TODO: check if can be used"},{"line_number":202,"context_line":"        # os.command(\"swift-init start object-auditor\")"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # And verify that the policy was applied"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"if __name__ \u003d\u003d \"__main__\":"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_bd8447d4","line":204,"updated":"2020-05-20 18:14:50.000000000","message":"pep8: E116 unexpected indentation (comment)","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        with open(conf_file, \u0027w\u0027) as configfile:  # save"},{"line_number":40,"context_line":"            config.write(configfile)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class TestDarkDataWatcher(ReplProbeTest):"},{"line_number":43,"context_line":"    def setUp(self):"},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":"        Reset all environment and start all servers."}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_df1b28c7","line":42,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        # check if configured any of \u0027egg:swift#dark_data\u0027, \u0027swift#dark_data\u0027,"},{"line_number":59,"context_line":"        # \u0027dark_data\u0027, \u0027dark_data#delete\u0027, \u0027swift#dark_data#quarantine\u0027 etc."},{"line_number":60,"context_line":"        self.dark_data_conf \u003d None # to be restored at tearDown"},{"line_number":61,"context_line":"        for item in watchers:"},{"line_number":62,"context_line":"            if (\u0027dark_data\u0027 in item):"},{"line_number":63,"context_line":"                self.dark_data_conf \u003d item"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_3f7a24f0","line":60,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E261 at least two spaces before inline comment","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"b1bf30a0825fe13848f73949b472fd671879d426","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            self.skipTest(\u0027Dark data watcher is not configured\u0027)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        # set watcher policy to quarantine objects."},{"line_number":70,"context_line":"        update_dark_data_conf(\u0027swift#dark_data#quarantine\u0027)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        super(TestDarkDataWatcher, self).setUp()"},{"line_number":73,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_c2f7bd8a","line":70,"updated":"2020-06-24 16:34:15.000000000","message":"Do you mind if I switch it to \"action\u003dquarantine\"? This way I can pass a kwarg to __init__.","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e3e9262158d02a56f6b8f5baf1555331a01e3664","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        # self.fail()"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"if __name__ \u003d\u003d \"__main__\":"},{"line_number":141,"context_line":"    unittest.main()"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf51134e_1f7f60e0","line":140,"updated":"2020-06-23 19:10:52.000000000","message":"pep8: E305 expected 2 blank lines after class or function definition, found 1","commit_id":"10f6e15e789b0bd69497642f13a587b0075dc03e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"7a90fa88fcf64f7b026ea4f4ebde3b63580a954b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":44,"context_line":"            writeconf(conf_file, CONF_SECTION, {\u0027action\u0027: \u0027quarantine\u0027})"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        super(TestDarkDataWatcher, self).setUp()"},{"line_number":47,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf51134e_321bcb73","line":44,"updated":"2020-07-22 20:19:04.000000000","message":"I tend to be uncomfortable with this. I know we much with configs already, so that train has left the station, but still... For instance, what does happen if the tests are killed in such a way that tearDown() did not have a chance to run? This is going to throw the double definition exception, right?","commit_id":"97d22ac51c32b275f80ea1fc371de33026615837"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"736fea8e45c65dede8626402dbb640a25cf37042","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":44,"context_line":"            writeconf(conf_file, CONF_SECTION, {\u0027action\u0027: \u0027quarantine\u0027})"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        super(TestDarkDataWatcher, self).setUp()"},{"line_number":47,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":28,"id":"9f560f44_8c20259d","line":44,"in_reply_to":"bf51134e_321bcb73","updated":"2020-08-10 14:22:31.000000000","message":"PS#29 addresses this concern. According to your suggestion, \nauditor will be called once pointing to a copy of /etc/swift config files","commit_id":"97d22ac51c32b275f80ea1fc371de33026615837"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5c63ad10ec3372bcef55519498fe2276b9fbc30f","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF_SECTION \u003d \u0027object-auditor:watcher:swift#dark_data\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TestDarkDataWatcher(ReplProbeTest):"},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        Reset all environment and start all servers."}],"source_content_type":"text/x-python","patch_set":29,"id":"9f560f44_a60a6522","line":34,"updated":"2020-08-10 17:53:27.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"9938facccebc45fa41c5ce62163e6fe208025e6c"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"d660deff3cc58fe8f8736b846b9fca1fc3a54705","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":42,"context_line":"            self.conf \u003d readconf(conf_file)"},{"line_number":43,"context_line":"            config \u003d self.conf.get(CONF_SECTION, {})"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        if len(config) \u003e 0:"},{"line_number":46,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f560f44_d91f6607","line":43,"updated":"2020-08-12 01:37:24.000000000","message":"This may be working, but looks unfinished.\n\nFirst, no need to set self.conf. You aren\u0027t using it later, are you? Just conf is fine.\n\nSecond, that \"if len(config) \u003e 0\" below seems like it belongs inside the loop, does it not?","commit_id":"9938facccebc45fa41c5ce62163e6fe208025e6c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5c63ad10ec3372bcef55519498fe2276b9fbc30f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.conf_dest \u003d os.path.join(\u0027/tmp/\u0027,"},{"line_number":49,"context_line":"                            datetime.now().strftime(\u0027swift-%Y-%m-%d_%H-%M-%S-%f\u0027))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        shutil.copytree(\u0027/etc/swift\u0027, self.conf_dest)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9f560f44_0606b120","line":49,"updated":"2020-08-10 17:53:27.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"9938facccebc45fa41c5ce62163e6fe208025e6c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5c63ad10ec3372bcef55519498fe2276b9fbc30f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.conf_dest \u003d os.path.join(\u0027/tmp/\u0027,"},{"line_number":49,"context_line":"                            datetime.now().strftime(\u0027swift-%Y-%m-%d_%H-%M-%S-%f\u0027))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        shutil.copytree(\u0027/etc/swift\u0027, self.conf_dest)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9f560f44_e600dd04","line":49,"updated":"2020-08-10 17:53:27.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"9938facccebc45fa41c5ce62163e6fe208025e6c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5c63ad10ec3372bcef55519498fe2276b9fbc30f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":54,"context_line":"            rel_path \u003d os.path.relpath(conf_file, \u0027/etc/swift\u0027)"},{"line_number":55,"context_line":"            new_path \u003d os.path.join(self.conf_dest, rel_path)"},{"line_number":56,"context_line":"            writeconf(new_path, \u0027object-auditor\u0027, {\u0027watchers\u0027: \u0027swift#dark_data\u0027})"},{"line_number":57,"context_line":"            writeconf(new_path, \u0027object-auditor:watcher:swift#dark_data\u0027, {\u0027action\u0027: \u0027quarantine\u0027})"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f560f44_4901da04","line":56,"updated":"2020-08-10 17:53:27.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"9938facccebc45fa41c5ce62163e6fe208025e6c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5c63ad10ec3372bcef55519498fe2276b9fbc30f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            rel_path \u003d os.path.relpath(conf_file, \u0027/etc/swift\u0027)"},{"line_number":55,"context_line":"            new_path \u003d os.path.join(self.conf_dest, rel_path)"},{"line_number":56,"context_line":"            writeconf(new_path, \u0027object-auditor\u0027, {\u0027watchers\u0027: \u0027swift#dark_data\u0027})"},{"line_number":57,"context_line":"            writeconf(new_path, \u0027object-auditor:watcher:swift#dark_data\u0027, {\u0027action\u0027: \u0027quarantine\u0027})"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"},{"line_number":60,"context_line":"        self.object_name \u003d \u0027object-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":29,"id":"9f560f44_29046614","line":57,"updated":"2020-08-10 17:53:27.000000000","message":"pep8: E501 line too long (99 \u003e 79 characters)","commit_id":"9938facccebc45fa41c5ce62163e6fe208025e6c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"CONF_SECTION \u003d \u0027object-auditor:watcher:swift#dark_data\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class TestDarkDataWatcher(ReplProbeTest):"},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        Reset all environment and start all servers."}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_5f8571ac","line":34,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.conf_dest \u003d os.path.join(\u0027/tmp/\u0027,"},{"line_number":49,"context_line":"                            datetime.now().strftime(\u0027swift-%Y-%m-%d_%H-%M-%S-%f\u0027))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        shutil.copytree(\u0027/etc/swift\u0027, self.conf_dest)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_bf8e4dce","line":49,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E128 continuation line under-indented for visual indent","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.conf_dest \u003d os.path.join(\u0027/tmp/\u0027,"},{"line_number":49,"context_line":"                            datetime.now().strftime(\u0027swift-%Y-%m-%d_%H-%M-%S-%f\u0027))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        shutil.copytree(\u0027/etc/swift\u0027, self.conf_dest)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_9f8b89be","line":49,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":54,"context_line":"            rel_path \u003d os.path.relpath(conf_file, \u0027/etc/swift\u0027)"},{"line_number":55,"context_line":"            new_path \u003d os.path.join(self.conf_dest, rel_path)"},{"line_number":56,"context_line":"            writeconf(new_path, \u0027object-auditor\u0027, {\u0027watchers\u0027: \u0027swift#dark_data\u0027})"},{"line_number":57,"context_line":"            writeconf(new_path, \u0027object-auditor:watcher:swift#dark_data\u0027, {\u0027action\u0027: \u0027quarantine\u0027})"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_ffbd6568","line":56,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            rel_path \u003d os.path.relpath(conf_file, \u0027/etc/swift\u0027)"},{"line_number":55,"context_line":"            new_path \u003d os.path.join(self.conf_dest, rel_path)"},{"line_number":56,"context_line":"            writeconf(new_path, \u0027object-auditor\u0027, {\u0027watchers\u0027: \u0027swift#dark_data\u0027})"},{"line_number":57,"context_line":"            writeconf(new_path, \u0027object-auditor:watcher:swift#dark_data\u0027, {\u0027action\u0027: \u0027quarantine\u0027})"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.container_name \u003d \u0027container-%s\u0027 % uuid.uuid4()"},{"line_number":60,"context_line":"        self.object_name \u003d \u0027object-%s\u0027 % uuid.uuid4()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_dfc221e9","line":57,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E501 line too long (99 \u003e 79 characters)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            os.unlink(file_path)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # Old node gets reintroduced to the cluster"},{"line_number":113,"context_line":"        self.brain.start_handoff_half()"},{"line_number":114,"context_line":"        # ...so replication thinks its got some work to do"},{"line_number":115,"context_line":"        Manager([\u0027object-replicator\u0027]).once()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_3fb4fd81","line":112,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        # from nose.tools import set_trace;"},{"line_number":124,"context_line":"        # set_trace()"},{"line_number":125,"context_line":"        # import pydevd_pycharm"},{"line_number":126,"context_line":"        # pydevd_pycharm.settrace(\u002710.100.102.26\u0027, port\u003d42798, stdoutToServer\u003dTrue, stderrToServer\u003dTrue)"},{"line_number":127,"context_line":"        Manager([\u0027object-auditor\u0027]).once(SWIFT_DIR\u003dself.conf_dest)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # Verify that the policy was applied. Since unit test verifies"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_1fb93978","line":126,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E501 line too long (104 \u003e 79 characters)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0d0112e7580030848a4fb27f472a898bc77b5de7","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"if __name__ \u003d\u003d \"__main__\":"},{"line_number":137,"context_line":"    unittest.main()"}],"source_content_type":"text/x-python","patch_set":30,"id":"9f560f44_7fb1558f","line":136,"updated":"2020-09-07 16:36:37.000000000","message":"pep8: E303 too many blank lines (3)","commit_id":"2eb4f0fc63528cb3ea8ac576da7068103cb9ab4b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                    self.assertEqual(err.http_status, 404)"},{"line_number":182,"context_line":"        finally:"},{"line_number":183,"context_line":"            # change SWIFT_DIR to the default for all manager objects"},{"line_number":184,"context_line":"            Manager([\u0027object-auditor\u0027]).once(SWIFT_DIR\u003d\"/etc/swift\")"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"class TestDarkDataQuarantining(TestDarkDataWatcher):"}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_cd87660f","line":184,"updated":"2020-10-27 18:07:51.000000000","message":"I wonder if it\u0027d be better to just go monkey-patch swift.common.manager.SWIFT_DIR directly in setUp/tearDown...","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f674a78dcad3290057fc7cb9b215bfaa992be5d6","unresolved":true,"context_lines":[{"line_number":118,"context_line":"                        continue"},{"line_number":119,"context_line":"                    _, ext \u003d os.path.splitext(file)"},{"line_number":120,"context_line":"                    result[ext].add(os.path.join(path, file))"},{"line_number":121,"context_line":"        return result"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def handle_dark_data(self):"},{"line_number":124,"context_line":"        old_swift_dir \u003d manager.SWIFT_DIR"}],"source_content_type":"text/x-python","patch_set":41,"id":"3852519f_cde97f37","line":121,"updated":"2020-12-02 10:33:28.000000000","message":"An aside. I wonder if we should start collecting these kind of probe helper methods and pull them into a utils of some sort. I know we have similar code to look at files on disk in other tests.\n\n\nThis has nothing to do with this patch, but would be a nice clean up.. maybe we should make a bug/bp/how_hanging_fruit about it.","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"38157d98b0247fb9496abc84e31a157fba490a31","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                        continue"},{"line_number":119,"context_line":"                    _, ext \u003d os.path.splitext(file)"},{"line_number":120,"context_line":"                    result[ext].add(os.path.join(path, file))"},{"line_number":121,"context_line":"        return result"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def handle_dark_data(self):"},{"line_number":124,"context_line":"        old_swift_dir \u003d manager.SWIFT_DIR"}],"source_content_type":"text/x-python","patch_set":41,"id":"b0a434a9_e5c4987f","line":121,"in_reply_to":"3852519f_cde97f37","updated":"2020-12-03 04:36:57.000000000","message":"Ack","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d8e33565bdf866e33debab872f66d64facefdd89","unresolved":true,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        self.action \u003d action"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":82,"context_line":"            config \u003d readconf(conf_file).get(CONF_SECTION, {})"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if len(config) \u003e 0:"},{"line_number":85,"context_line":"            self.skipTest(\u0027Dark data watcher is configured across nodes\u0027)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.conf_dest \u003d \\"},{"line_number":88,"context_line":"            os.path.join(\u0027/tmp/\u0027,"}],"source_content_type":"text/x-python","patch_set":42,"id":"a07c6eb4_99dad47a","line":85,"range":{"start_line":81,"start_character":8,"end_line":85,"end_character":73},"updated":"2020-12-10 21:02:28.000000000","message":"I think we can drop this now?","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"117fef8e03b47c814875567cffd64738064e7e9b","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":94,"context_line":"            rel_path \u003d os.path.join(*(conf_file.split(os.path.sep)[3:]))"},{"line_number":95,"context_line":"            new_path \u003d os.path.join(self.conf_dest, rel_path)"},{"line_number":96,"context_line":"            writeconf(new_path, \u0027object-auditor\u0027,"},{"line_number":97,"context_line":"                      {\u0027watchers\u0027: \u0027swift#dark_data\u0027})"},{"line_number":98,"context_line":"            writeconf(new_path, \u0027object-auditor:watcher:swift#dark_data\u0027,"},{"line_number":99,"context_line":"                      {\u0027action\u0027: action})"}],"source_content_type":"text/x-python","patch_set":42,"id":"69aa0fd1_7bddb1cb","line":96,"updated":"2020-12-10 06:35:00.000000000","message":"This doesn\u0027t play well with conf.d setups 😞\n\n Traceback (most recent call last):\n   File \"/vagrant/swift/test/probe/test_dark_data.py\", line 97, in setUp\n     writeconf(new_path, \u0027object-auditor\u0027,\n   File \"/vagrant/swift/test/probe/test_dark_data.py\", line 55, in writeconf\n     raise IOError(\"Unable to read config from %s\" % conf_file)\n OSError: Unable to read config from /tmp/swift-2020-12-10_01-31-46-421921/object-server/1.conf.d\n\n(Sorry, the line numbers/function names are all messed up; looking at some refactoring...)\n\nNot a blocker as long as the gate\u0027s behaving itself, I think...","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"994cc075c5e25fca3aee2ca7cb220326c04bde58","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":94,"context_line":"            rel_path \u003d os.path.join(*(conf_file.split(os.path.sep)[3:]))"},{"line_number":95,"context_line":"            new_path \u003d os.path.join(self.conf_dest, rel_path)"},{"line_number":96,"context_line":"            writeconf(new_path, \u0027object-auditor\u0027,"},{"line_number":97,"context_line":"                      {\u0027watchers\u0027: \u0027swift#dark_data\u0027})"},{"line_number":98,"context_line":"            writeconf(new_path, \u0027object-auditor:watcher:swift#dark_data\u0027,"},{"line_number":99,"context_line":"                      {\u0027action\u0027: action})"}],"source_content_type":"text/x-python","patch_set":42,"id":"894d5bf1_661a4e5c","line":96,"in_reply_to":"69aa0fd1_7bddb1cb","updated":"2020-12-10 16:31:59.000000000","message":"I do not understand. Probe tests only work with SAIO, right? And SAIO is set up in a rigid way, as spelled in development_saio.rst, right? How did you jam conf.d in there?","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d8e33565bdf866e33debab872f66d64facefdd89","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        for conf_file in Server(\u0027object-auditor\u0027).conf_files():"},{"line_number":94,"context_line":"            rel_path \u003d os.path.join(*(conf_file.split(os.path.sep)[3:]))"},{"line_number":95,"context_line":"            new_path \u003d os.path.join(self.conf_dest, rel_path)"},{"line_number":96,"context_line":"            writeconf(new_path, \u0027object-auditor\u0027,"},{"line_number":97,"context_line":"                      {\u0027watchers\u0027: \u0027swift#dark_data\u0027})"},{"line_number":98,"context_line":"            writeconf(new_path, \u0027object-auditor:watcher:swift#dark_data\u0027,"},{"line_number":99,"context_line":"                      {\u0027action\u0027: action})"}],"source_content_type":"text/x-python","patch_set":42,"id":"dee70054_848d88b2","line":96,"in_reply_to":"894d5bf1_661a4e5c","updated":"2020-12-10 21:02:28.000000000","message":"So VSAIO (which Clay and I like as our dev env) uses conf.d so it ca use symlinks in a bunch of places: https://github.com/swiftstack/vagrant-swift-all-in-one/blob/master/cookbooks/swift/recipes/configs.rb#L246-L390\n\nNet result is I\u0027ve got a tree like\n\n /etc/swift/object-server/\n ├── 1.conf.d\n │   ├── 00_base.conf -\u003e /etc/swift/base.conf-template\n │   ├── 10_node.conf -\u003e /etc/swift/node1.conf-template\n │   ├── 20_server.conf -\u003e /etc/swift/object-server/server.conf-template\n │   ├── 30_settings.conf\n │   └── 40_replication.conf -\u003e /etc/swift/object-server/replication-daemons.conf-template\n ├── 2.conf.d\n │   ├── 00_base.conf -\u003e /etc/swift/base.conf-template\n │   ├── 10_node.conf -\u003e /etc/swift/node2.conf-template\n │   ├── 20_server.conf -\u003e /etc/swift/object-server/server.conf-template\n │   ├── 30_settings.conf\n │   └── 40_replication.conf -\u003e /etc/swift/object-server/replication-daemons.conf-template\n ├── 3.conf.d\n │   ├── 00_base.conf -\u003e /etc/swift/base.conf-template\n │   ├── 10_node.conf -\u003e /etc/swift/node3.conf-template\n │   ├── 20_server.conf -\u003e /etc/swift/object-server/server.conf-template\n │   ├── 30_settings.conf\n │   └── 40_replication.conf -\u003e /etc/swift/object-server/replication-daemons.conf-template\n ├── 4.conf.d\n │   ├── 00_base.conf -\u003e /etc/swift/base.conf-template\n │   ├── 10_node.conf -\u003e /etc/swift/node4.conf-template\n │   ├── 20_server.conf -\u003e /etc/swift/object-server/server.conf-template\n │   ├── 30_settings.conf\n │   └── 40_replication.conf -\u003e /etc/swift/object-server/replication-daemons.conf-template\n ├── replication-daemons.conf-template\n └── server.conf-template\n\n...which (serendipitously?) works with all existing probe tests.\n\nThe composability is rather nice; if I want to adjust my log_level or whether eventlet debugging is on, I can update one place to affect all daemons.\n\nOTOH, that *in no way* resembles how I change configs in prod, so maybe it\u0027s better that I disabuse myself of that habit sooner rather than later...","commit_id":"c981baefae6e6be50d8642cbb430437789373742"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f47dedb67147c29f73b7bc8bc16b4b324761d2f2","unresolved":true,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class TestDarkDataQuarantining(TestDarkDataWatcher):"},{"line_number":191,"context_line":"    def setUp(self):"},{"line_number":192,"context_line":"        self.prepare(\u0027quarantine\u0027)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_dark_data_quarantining(self):"},{"line_number":195,"context_line":"        self.handle_dark_data()"}],"source_content_type":"text/x-python","patch_set":42,"id":"65ce95c4_936b60f9","line":192,"updated":"2020-12-09 09:05:01.000000000","message":"Should we confirm the that objects in question are in quarantine? Not blocking merge for this though.","commit_id":"c981baefae6e6be50d8642cbb430437789373742"}],"test/unit/obj/test_auditor.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":1604,"context_line":"                calls.append([\u0027start\u0027, audit_type])"},{"line_number":1605,"context_line":""},{"line_number":1606,"context_line":"            def see_object(self, sequence_number, metadata,"},{"line_number":1607,"context_line":"                           storage_policy_index, partition, **other_kwargs):"},{"line_number":1608,"context_line":"                calls.append([\u0027see_object\u0027, sequence_number, metadata,"},{"line_number":1609,"context_line":"                              storage_policy_index, partition, other_kwargs])"},{"line_number":1610,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_134e4d6e","line":1607,"updated":"2020-06-01 19:45:58.000000000","message":"Might want checks like\n\n if not self._started:\n     raise Exception(\u0027see_object called before start\u0027)\n if self._ended:\n     raise Exception(\u0027see_object called after end\u0027)\n\nsimilar to the sanity checks in start and end. OTOH, though, we already check that after the run by inspecting calls... *shrug*","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"270c19f834f3f0147ec43dbe3a27ac29003e0966","unresolved":false,"context_lines":[{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":1682,"context_line":"        self.assertIn(\u0027DarkDataWatcher total unknown 2 ok 0 dark 0\u0027, log_lines)"},{"line_number":1683,"context_line":""},{"line_number":1684,"context_line":""},{"line_number":1685,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":1686,"context_line":"    unittest.main()"}],"source_content_type":"text/x-python","patch_set":12,"id":"ff570b3c_33cef1b3","line":1683,"updated":"2020-06-01 19:45:58.000000000","message":"We probably don\u0027t need *everything* from Sam\u0027s test_crashy_watchers, but it did cover a few things I don\u0027t really see tested anymore:\n\n* we can have more than one watcher loaded, and whether the config should be space separated, comma separated, or what\n* how crashes in one watcher impact (or don\u0027t) other workers","commit_id":"4a72c1b19ee6eb2c754e8c02bb987c103b200aa6"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"336b927aa307a61fac7d99d1db13392b0cb90884","unresolved":false,"context_lines":[{"line_number":1625,"context_line":""},{"line_number":1626,"context_line":"        conf \u003d self.conf.copy()"},{"line_number":1627,"context_line":"        conf[\u0027watchers\u0027] \u003d \u0027test_watcher1\u0027"},{"line_number":1628,"context_line":"        conf[\u0027__file__\u0027] \u003d \u0027/etc/swift/swift.conf\u0027"},{"line_number":1629,"context_line":"        ret_config \u003d {\u0027swift#dark_data\u0027: {\u0027action\u0027: \u0027log\u0027}}"},{"line_number":1630,"context_line":"        with mock.patch(\u0027swift.common.utils.parse_prefixed_conf\u0027,"},{"line_number":1631,"context_line":"                        return_value\u003dret_config):"}],"source_content_type":"text/x-python","patch_set":21,"id":"bf51134e_af457bb6","line":1628,"updated":"2020-07-09 17:58:19.000000000","message":"mock the parse_prefixed_conf as well. it will spare the need \nof openeeing the conf[\u0027__file__\u0027] and (will look like more unittesty)","commit_id":"a4ab7d873eef67a03b10174462b38701467fc38b"},{"author":{"_account_id":18142,"name":"David Sariel","email":"dsariel@redhat.com","username":"dsariel"},"change_message_id":"336b927aa307a61fac7d99d1db13392b0cb90884","unresolved":false,"context_lines":[{"line_number":1686,"context_line":""},{"line_number":1687,"context_line":"        conf \u003d self.conf.copy()"},{"line_number":1688,"context_line":"        conf[\u0027watchers\u0027] \u003d \u0027test_watcher1\u0027"},{"line_number":1689,"context_line":"        conf[\u0027__file__\u0027] \u003d \u0027/etc/swift/swift.conf\u0027"},{"line_number":1690,"context_line":"        ret_config \u003d {\u0027swift#dark_data\u0027: {\u0027action\u0027: \u0027log\u0027}}"},{"line_number":1691,"context_line":"        with mock.patch(\u0027swift.common.utils.parse_prefixed_conf\u0027,"},{"line_number":1692,"context_line":"                        return_value\u003dret_config):"}],"source_content_type":"text/x-python","patch_set":21,"id":"bf51134e_6f3fe324","line":1689,"updated":"2020-07-09 17:58:19.000000000","message":"same as in LL 1628","commit_id":"a4ab7d873eef67a03b10174462b38701467fc38b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"def no_audit_watchers(group, name\u003dNone):"},{"line_number":69,"context_line":"    if group \u003d\u003d \u0027swift.object_audit_watcher\u0027:"},{"line_number":70,"context_line":"        return iter([])"},{"line_number":71,"context_line":"    else:"},{"line_number":72,"context_line":"        return pkg_resources.iter_entry_points(group, name)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_eedfb9d3","line":70,"updated":"2020-10-27 18:07:51.000000000","message":"Why do we need this? Tests pass without it -- but maybe that\u0027s just because I don\u0027t have any watchers currently configured?","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"576c1c0795afff4a8d9b3610d983bb275f9042b0","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"def no_audit_watchers(group, name\u003dNone):"},{"line_number":69,"context_line":"    if group \u003d\u003d \u0027swift.object_audit_watcher\u0027:"},{"line_number":70,"context_line":"        return iter([])"},{"line_number":71,"context_line":"    else:"},{"line_number":72,"context_line":"        return pkg_resources.iter_entry_points(group, name)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_b5ab4587","line":70,"in_reply_to":"3f65232a_eedfb9d3","updated":"2020-10-28 03:50:48.000000000","message":"I think it\u0027s there because I have a SAIO on my laptop, and tests quietly loaded something completely different from what I thought, but honestly I forgot why this is necessary.","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"334b1cf7e56eae7796ececf10dfa55625d84269f","unresolved":false,"context_lines":[{"line_number":1715,"context_line":"        # if anything goes wrong inside, we want it fail the test."},{"line_number":1716,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":1717,"context_line":"        self.assertIn("},{"line_number":1718,"context_line":"            \u0027[audit-watcher DarkDataWatcher] total unknown 0 ok 2 dark 0\u0027,"},{"line_number":1719,"context_line":"            log_lines)"},{"line_number":1720,"context_line":""},{"line_number":1721,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"3f65232a_0e9315fc","line":1718,"range":{"start_line":1718,"start_character":45,"end_line":1718,"end_character":72},"updated":"2020-10-27 18:07:51.000000000","message":"I wonder if it\u0027d be better/more obvious like\n\n total unknown:0 ok:2 dark:0","commit_id":"15f7f3880fbd94182b5b0414ea0c33de093fb250"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f674a78dcad3290057fc7cb9b215bfaa992be5d6","unresolved":true,"context_lines":[{"line_number":1561,"context_line":"                         \"orphaned children left {0}, expected 0.\""},{"line_number":1562,"context_line":"                         .format(outstanding_pids))"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"    def _setup_watcher_test(self):"},{"line_number":1565,"context_line":"        timestamp \u003d Timestamp(time.time())"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"        data \u003d b\u00270\u0027 * 1024"}],"source_content_type":"text/x-python","patch_set":41,"id":"4c9cdb24_349f672b","line":1564,"updated":"2020-12-02 10:33:28.000000000","message":"Instead of pulling this setup out, can\u0027t we just create a new TestCase:\n\n  class TestAuditorWatcher(TestAuditor):\n\n    def setup(self):\n        super(TestAuditorWatcher, self).setUp()\n        # now add class setup\n\n\nIt would probably be cleaner, and use the mechanics of the TestCase classes.","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"38157d98b0247fb9496abc84e31a157fba490a31","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"                         \"orphaned children left {0}, expected 0.\""},{"line_number":1562,"context_line":"                         .format(outstanding_pids))"},{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"    def _setup_watcher_test(self):"},{"line_number":1565,"context_line":"        timestamp \u003d Timestamp(time.time())"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"        data \u003d b\u00270\u0027 * 1024"}],"source_content_type":"text/x-python","patch_set":41,"id":"125bf81e_bda06762","line":1564,"in_reply_to":"4c9cdb24_349f672b","updated":"2020-12-03 04:36:57.000000000","message":"Done\n\nHeh, no. The code snippet in the comment would execute all tests in TestAuditor twice; but those written for TestAuditor would fail while running in TestAuditorWatcher\u0027s environment. But I see what you mean, I made a common base class.","commit_id":"a463427fb631a76917c1b7f3dfddda1eab99b847"}]}
