)]}'
{"etc/object-server.conf-sample":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd5408293b0ce4a8e7d017fef35511f60e31d0f8","unresolved":true,"context_lines":[{"line_number":533,"context_line":"#"},{"line_number":534,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":535,"context_line":"# action\u003dlog"},{"line_number":536,"context_line":"# grace_age\u003d604800"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"[object-expirer]"},{"line_number":539,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"a783b7cf_26774313","line":536,"range":{"start_line":536,"start_character":12,"end_line":536,"end_character":18},"updated":"2021-05-19 23:44:24.000000000","message":"Right; matches the default 1-week reclaim_age.\n\nIf an operator has separate a reclaim_age per service, which one would you recommend they set this to? My gut says it ought to match the container layer...","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"301889ab33cb89a2fa6d23cb952a6fcba8c48cf2","unresolved":true,"context_lines":[{"line_number":533,"context_line":"#"},{"line_number":534,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":535,"context_line":"# action\u003dlog"},{"line_number":536,"context_line":"# grace_age\u003d604800"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"[object-expirer]"},{"line_number":539,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"8c7f9530_8e5f3851","line":536,"range":{"start_line":536,"start_character":12,"end_line":536,"end_character":18},"in_reply_to":"a783b7cf_26774313","updated":"2021-05-20 03:23:10.000000000","message":"I\u0027d go with the longer one.","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":532,"context_line":"# like the following (note that entry points are qualified by package#):"},{"line_number":533,"context_line":"#"},{"line_number":534,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":535,"context_line":"# action\u003dlog"},{"line_number":536,"context_line":"# grace_age\u003d604800"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"[object-expirer]"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"66db001c_773f0d43","line":535,"updated":"2021-05-26 12:03:03.000000000","message":"this is unrelated to the bug, but since there\u0027s a change to the conf loading, it could be worth adding comment here giving the supported actions","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"aa4519e88eefa6a6cb30afc34e2a1a745baa4284","unresolved":false,"context_lines":[{"line_number":532,"context_line":"# like the following (note that entry points are qualified by package#):"},{"line_number":533,"context_line":"#"},{"line_number":534,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":535,"context_line":"# action\u003dlog"},{"line_number":536,"context_line":"# grace_age\u003d604800"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"[object-expirer]"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"538638e3_3f397554","line":535,"in_reply_to":"66db001c_773f0d43","updated":"2021-06-02 05:22:19.000000000","message":"Done","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":533,"context_line":"#"},{"line_number":534,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":535,"context_line":"# action\u003dlog"},{"line_number":536,"context_line":"# grace_age\u003d604800"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"[object-expirer]"},{"line_number":539,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"a90396e1_a0fc7454","line":536,"range":{"start_line":536,"start_character":2,"end_line":536,"end_character":18},"updated":"2021-05-26 12:03:03.000000000","message":"a comment would be useful describing what this does (and maybe a warning about setting it too low and the consequences, or a link to the bug report)","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"aa4519e88eefa6a6cb30afc34e2a1a745baa4284","unresolved":false,"context_lines":[{"line_number":533,"context_line":"#"},{"line_number":534,"context_line":"# [object-auditor:watcher:swift#dark_data]"},{"line_number":535,"context_line":"# action\u003dlog"},{"line_number":536,"context_line":"# grace_age\u003d604800"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"[object-expirer]"},{"line_number":539,"context_line":"# If this true, this expirer will execute tasks from legacy expirer task queue,"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"10cb676d_4c67deb4","line":536,"range":{"start_line":536,"start_character":2,"end_line":536,"end_character":18},"in_reply_to":"a90396e1_a0fc7454","updated":"2021-06-02 05:22:19.000000000","message":"Done","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":528,"context_line":"#"},{"line_number":529,"context_line":"# watchers \u003d"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"# Watcher-specific parameters can he added in a secttion with a name"},{"line_number":532,"context_line":"# [object-auditor:watcher:some_package#some_watcher]. The following"},{"line_number":533,"context_line":"# example uses the built-in reference watcher."},{"line_number":534,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"e17d543a_0d53c4e3","line":531,"range":{"start_line":531,"start_character":34,"end_line":531,"end_character":36},"updated":"2021-06-28 11:47:06.000000000","message":"s/he/be/","commit_id":"a82e66e6ea9f1a96cdb3e6ce9e36047d656d40c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":528,"context_line":"#"},{"line_number":529,"context_line":"# watchers \u003d"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"# Watcher-specific parameters can he added in a secttion with a name"},{"line_number":532,"context_line":"# [object-auditor:watcher:some_package#some_watcher]. The following"},{"line_number":533,"context_line":"# example uses the built-in reference watcher."},{"line_number":534,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"246b3ce7_fb670b94","line":531,"range":{"start_line":531,"start_character":48,"end_line":531,"end_character":56},"updated":"2021-06-28 11:47:06.000000000","message":"s/secttion/section/","commit_id":"a82e66e6ea9f1a96cdb3e6ce9e36047d656d40c6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4e16252020efc7e07dae4504449999d18d211fe7","unresolved":false,"context_lines":[{"line_number":528,"context_line":"#"},{"line_number":529,"context_line":"# watchers \u003d"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"# Watcher-specific parameters can he added in a secttion with a name"},{"line_number":532,"context_line":"# [object-auditor:watcher:some_package#some_watcher]. The following"},{"line_number":533,"context_line":"# example uses the built-in reference watcher."},{"line_number":534,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"8aa46b84_72737662","line":531,"range":{"start_line":531,"start_character":48,"end_line":531,"end_character":56},"in_reply_to":"246b3ce7_fb670b94","updated":"2021-06-30 21:37:55.000000000","message":"Done","commit_id":"a82e66e6ea9f1a96cdb3e6ce9e36047d656d40c6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"4e16252020efc7e07dae4504449999d18d211fe7","unresolved":false,"context_lines":[{"line_number":528,"context_line":"#"},{"line_number":529,"context_line":"# watchers \u003d"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"# Watcher-specific parameters can he added in a secttion with a name"},{"line_number":532,"context_line":"# [object-auditor:watcher:some_package#some_watcher]. The following"},{"line_number":533,"context_line":"# example uses the built-in reference watcher."},{"line_number":534,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"ed637105_0cd79188","line":531,"range":{"start_line":531,"start_character":34,"end_line":531,"end_character":36},"in_reply_to":"e17d543a_0d53c4e3","updated":"2021-06-30 21:37:55.000000000","message":"Done (by squash)","commit_id":"a82e66e6ea9f1a96cdb3e6ce9e36047d656d40c6"}],"swift/obj/watchers/dark_data.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd5408293b0ce4a8e7d017fef35511f60e31d0f8","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":70,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":71,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"}],"source_content_type":"text/x-python","patch_set":2,"id":"191b0745_438d6321","line":72,"updated":"2021-05-19 23:44:24.000000000","message":"Would it be better to use\n\n conf.get(\u0027action\u0027, \u0027log\u0027)\n\nabove?","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"301889ab33cb89a2fa6d23cb952a6fcba8c48cf2","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":70,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":71,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba55b0de_d7d0e1da","line":72,"in_reply_to":"191b0745_438d6321","updated":"2021-05-20 03:23:10.000000000","message":"If you use conf.get(\u0027action\u0027,\u0027log\u0027), you lose the ability to report a typo, because the information is lost.","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"90e8db9cb9d5e6745bc758cd2bc0ebb1004915d4","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":70,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":71,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ee1f664_b1e891e9","line":72,"in_reply_to":"1e0201b5_f01e0d55","updated":"2021-05-21 02:59:55.000000000","message":"Did I understand you right though? I thought you meant\n\n    policy \u003d conf.get(\u0027action\u0027, \u0027log\u0027)\n    if policy not in [\u0027log\u0027, \u0027delete\u0027]:\n        logger.warning(\"bad %r\" % policy)\n        policy \u003d \u0027log\u0027\n    else:\n        # now what? You cannot know if \u0027log\" is from conf or the default","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d938680b9ac4da6e1fdc704e18188b306907bbdf","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":70,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":71,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"}],"source_content_type":"text/x-python","patch_set":2,"id":"81feeffb_8c37c8d6","line":72,"in_reply_to":"1ee1f664_b1e891e9","updated":"2021-05-21 18:49:45.000000000","message":"Yeah, that was more or less my thinking. But we don\u0027t care whether it was explicitly set or the default -- the else isn\u0027t necessary.","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"05c23abe77a46f03f1665ff5b53d95bc90d42479","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":70,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":71,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"}],"source_content_type":"text/x-python","patch_set":2,"id":"d95ed698_4093784c","line":72,"in_reply_to":"81feeffb_8c37c8d6","updated":"2021-05-22 02:21:16.000000000","message":"Right... Not unless we add logger.info(\"using action %r\" % policy) in that else:, in order to cover the first example, atcion \u003d delete. Currently the code is completely silent if configuration key is wrong. The auditor logs a line as it loads a watcher, so I didn\u0027t want to make us noisier. Should I do something about it?","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"611d94df3cabc72dcd948d240a74b24a6e7fc7cd","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.container_ring \u003d Ring(swift_dir, ring_name\u003d\u0027container\u0027)"},{"line_number":70,"context_line":"        self.dark_data_policy \u003d conf.get(\u0027action\u0027)"},{"line_number":71,"context_line":"        if self.dark_data_policy not in [\u0027log\u0027, \u0027delete\u0027, \u0027quarantine\u0027]:"},{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"}],"source_content_type":"text/x-python","patch_set":2,"id":"1e0201b5_f01e0d55","line":72,"in_reply_to":"ba55b0de_d7d0e1da","updated":"2021-05-21 01:12:49.000000000","message":"Which typo?\n\n atcion \u003d delete\n\nor\n\n action \u003d dlete\n\n? If we\u0027re worried about the first, we\u0027re still not going to log the warning since self.dark_data_policy is None. If the latter, it\u0027s going to be \u0027dlete\u0027 and we\u0027ll log either way.","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"dd5408293b0ce4a8e7d017fef35511f60e31d0f8","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            mtime \u003d os.stat(data_file_path).st_mtime"},{"line_number":106,"context_line":"        except OSError:"},{"line_number":107,"context_line":"            self.tot_unknown +\u003d 1"},{"line_number":108,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"4c1bb82c_9f28b1ac","line":105,"range":{"start_line":105,"start_character":44,"end_line":105,"end_character":52},"updated":"2021-05-19 23:44:24.000000000","message":"Do we want to look at mtime, or the timestamp from the .data?\n\nDoes rsync preserve mtime during a rebalance? Pretty sure ssync won\u0027t.","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"301889ab33cb89a2fa6d23cb952a6fcba8c48cf2","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            mtime \u003d os.stat(data_file_path).st_mtime"},{"line_number":106,"context_line":"        except OSError:"},{"line_number":107,"context_line":"            self.tot_unknown +\u003d 1"},{"line_number":108,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"25dc519e_c909ca76","line":105,"range":{"start_line":105,"start_character":44,"end_line":105,"end_character":52},"in_reply_to":"4c1bb82c_9f28b1ac","updated":"2021-05-20 03:23:10.000000000","message":"Good point, I\u0027ll respin this.\n\nI found that the put timestamp is not available in the metadata that auditor supplies to watchers. That is why I resorted to the Unix mtime.","commit_id":"e14144e75cb6071ff2c95ca0b4e2efa4e71b454d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"},{"line_number":76,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"},{"line_number":77,"context_line":"        self.grace_age \u003d int(conf.get(\u0027grace_age\u0027, 604800))"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c699dcfb_e40b7468","line":75,"updated":"2021-05-26 12:03:03.000000000","message":"so this is unrelated? but is the goal to reduce the warning logs to only when the conf has an invalid value rather than no value?","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"},{"line_number":76,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"},{"line_number":77,"context_line":"        self.grace_age \u003d int(conf.get(\u0027grace_age\u0027, 604800))"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"473927ac_7bcb8342","line":75,"in_reply_to":"3c02acf7_8988f4fc","updated":"2021-06-28 11:47:06.000000000","message":"It\u0027s fine as it is thanks","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"aa4519e88eefa6a6cb30afc34e2a1a745baa4284","unresolved":true,"context_lines":[{"line_number":72,"context_line":"            if self.dark_data_policy is not None:"},{"line_number":73,"context_line":"                self.logger.warning("},{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"},{"line_number":76,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"},{"line_number":77,"context_line":"        self.grace_age \u003d int(conf.get(\u0027grace_age\u0027, 604800))"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3c02acf7_8988f4fc","line":75,"in_reply_to":"c699dcfb_e40b7468","updated":"2021-06-02 05:22:19.000000000","message":"Yes, an empty value means default. I suppose we could put info here, do you think it would be better?","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"},{"line_number":76,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"},{"line_number":77,"context_line":"        self.grace_age \u003d int(conf.get(\u0027grace_age\u0027, 604800))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def start(self, audit_type, **other_kwargs):"},{"line_number":80,"context_line":"        self.is_zbf \u003d audit_type \u003d\u003d \u0027ZBF\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"e70ae152_cccd9b4c","line":77,"updated":"2021-05-26 12:03:03.000000000","message":"I didn\u0027t see a test fail when I set the default to 0 (see my follow patch)","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"},{"line_number":76,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"},{"line_number":77,"context_line":"        self.grace_age \u003d int(conf.get(\u0027grace_age\u0027, 604800))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def start(self, audit_type, **other_kwargs):"},{"line_number":80,"context_line":"        self.is_zbf \u003d audit_type \u003d\u003d \u0027ZBF\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"ed7d9dbc_b4c52d5a","line":77,"in_reply_to":"9893264d_e49134d7","updated":"2021-06-28 11:47:06.000000000","message":"I just meant that there didn\u0027t appear to be test that checks the default value is as claimed","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"aa4519e88eefa6a6cb30afc34e2a1a745baa4284","unresolved":true,"context_lines":[{"line_number":74,"context_line":"                    \"Dark data action %r unknown, defaults to action \u003d \u0027log\u0027\" %"},{"line_number":75,"context_line":"                    (self.dark_data_policy,))"},{"line_number":76,"context_line":"            self.dark_data_policy \u003d \u0027log\u0027"},{"line_number":77,"context_line":"        self.grace_age \u003d int(conf.get(\u0027grace_age\u0027, 604800))"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def start(self, audit_type, **other_kwargs):"},{"line_number":80,"context_line":"        self.is_zbf \u003d audit_type \u003d\u003d \u0027ZBF\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"9893264d_e49134d7","line":77,"in_reply_to":"e70ae152_cccd9b4c","updated":"2021-06-02 05:22:19.000000000","message":"I don\u0027t quite follow what you\u0027re trying to accomplish with the zero grace_age. In our tests we have have a faux strong consistency: the container listings are always good and you cannot race them with the auditor. Notice that we mock the container server replies. So even if the grace_age is zero, you cannot reliably hit a spurious dark object. The only option is to change the faked reply so it\u0027s dark, which we do. Is this the problem we\u0027re looking at?","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        if self.is_zbf:"},{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        put_tstr \u003d os.path.basename(data_file_path).split(\u0027.\u0027)[0]"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            put_time \u003d int(put_tstr)"},{"line_number":107,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"f89457d6_f934971a","line":104,"range":{"start_line":104,"start_character":52,"end_line":104,"end_character":62},"updated":"2021-05-26 12:03:03.000000000","message":"is this deliberately splitting on the timestamp decimal point \u0027.\u0027 rather than the file extension delimiter \u0027.\u0027? That does avoid blowing up with ec fragments, and I guess we don\u0027t need the accuracy, but it is certainly worth commenting.\n\nTBH I\u0027d prefer if it parsed the timestamp in full, just because it\u0027s less surprising.\n\nBut...see below...the timestamp is in the metadata :)","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"aa4519e88eefa6a6cb30afc34e2a1a745baa4284","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        if self.is_zbf:"},{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        put_tstr \u003d os.path.basename(data_file_path).split(\u0027.\u0027)[0]"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            put_time \u003d int(put_tstr)"},{"line_number":107,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":3,"id":"35283b33_050cff95","line":104,"range":{"start_line":104,"start_character":52,"end_line":104,"end_character":62},"in_reply_to":"f89457d6_f934971a","updated":"2021-06-02 05:22:19.000000000","message":"I didn\u0027t see timestamp in metadata, but I see it now, under the key \u0027X-Timestamp\u0027.","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"611d94df3cabc72dcd948d240a74b24a6e7fc7cd","unresolved":true,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        put_tstr \u003d os.path.basename(data_file_path).split(\u0027.\u0027)[0]"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            put_time \u003d int(put_tstr)"},{"line_number":107,"context_line":"        except ValueError:"},{"line_number":108,"context_line":"            self.tot_unknown +\u003d 1"},{"line_number":109,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"61c8db83_779f3b65","line":106,"updated":"2021-05-21 01:12:49.000000000","message":"Maybe\n\n put_time \u003d Timestamp(os.path.basename(data_file_path))\n\n? *shrug*","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"aa4519e88eefa6a6cb30afc34e2a1a745baa4284","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        put_tstr \u003d os.path.basename(data_file_path).split(\u0027.\u0027)[0]"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            put_time \u003d int(put_tstr)"},{"line_number":107,"context_line":"        except ValueError:"},{"line_number":108,"context_line":"            self.tot_unknown +\u003d 1"},{"line_number":109,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"a3710f74_8aa9600d","line":106,"in_reply_to":"3719e6e2_db568140","updated":"2021-06-02 05:22:19.000000000","message":"Ack","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        put_tstr \u003d os.path.basename(data_file_path).split(\u0027.\u0027)[0]"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            put_time \u003d int(put_tstr)"},{"line_number":107,"context_line":"        except ValueError:"},{"line_number":108,"context_line":"            self.tot_unknown +\u003d 1"},{"line_number":109,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"3719e6e2_db568140","line":106,"in_reply_to":"45684d55_c6cac2fc","updated":"2021-05-26 12:03:03.000000000","message":"It looks like the auditor would have quarantined any object with bad filenames etc and not even call the watcher.\n\nThe timestamp is in the object_metadata. That might be the timestamp of a .meta file, but that\u0027s probably ok.","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"90e8db9cb9d5e6745bc758cd2bc0ebb1004915d4","unresolved":true,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        put_tstr \u003d os.path.basename(data_file_path).split(\u0027.\u0027)[0]"},{"line_number":105,"context_line":"        try:"},{"line_number":106,"context_line":"            put_time \u003d int(put_tstr)"},{"line_number":107,"context_line":"        except ValueError:"},{"line_number":108,"context_line":"            self.tot_unknown +\u003d 1"},{"line_number":109,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"45684d55_c6cac2fc","line":106,"in_reply_to":"61c8db83_779f3b65","updated":"2021-05-21 02:59:55.000000000","message":"Possibly I was too smart for my own good. Suppose we have a bad file name for whatever reason. I actually thought about checking if it ends in .data, .meta, or .ts. But in general it\u0027s unclear what to do with those at all... maybe quarantine right away no matter what? But then auditor ought to do it by itself. Present code ignores them, if any.","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":109,"context_line":"                self.tot_okay +\u003d 1"},{"line_number":110,"context_line":"                return"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        obj_path \u003d object_metadata[\u0027name\u0027]"},{"line_number":113,"context_line":"        try:"},{"line_number":114,"context_line":"            obj_info \u003d get_info_1(self.container_ring, obj_path, self.logger)"},{"line_number":115,"context_line":"        except ContainerError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"319d0db3_5a03c400","line":112,"updated":"2021-06-28 11:47:06.000000000","message":"nit: at line 104 object_metadata could not have X-Timestamp, but here it must have \u0027name\u0027 or a KeyError will be raised - is that consistent? That said, IIUC the auditor would fail to have an open diskfile if the metadata was missing X-Timestamp.","commit_id":"a82e66e6ea9f1a96cdb3e6ce9e36047d656d40c6"}],"test/probe/test_dark_data.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":64,"context_line":"            # We set grace_age to 0 so that tests don\u0027t have to deal with time."},{"line_number":65,"context_line":"            config.setdefault(CONF_SECTION, {}).update("},{"line_number":66,"context_line":"                {\u0027action\u0027: self.action,"},{"line_number":67,"context_line":"                 \u0027grace_age\u0027: \"0\"})"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"            parser \u003d ConfigParser()"},{"line_number":70,"context_line":"            for section in (\u0027object-auditor\u0027, CONF_SECTION):"}],"source_content_type":"text/x-python","patch_set":3,"id":"23c5c0d6_92aaa92a","line":67,"updated":"2021-05-26 12:03:03.000000000","message":"is it worth adding the probe test from the bug report?","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"052b78533c1a8cd05052d4ac5af4383f1dbe3c30","unresolved":true,"context_lines":[{"line_number":64,"context_line":"            # We set grace_age to 0 so that tests don\u0027t have to deal with time."},{"line_number":65,"context_line":"            config.setdefault(CONF_SECTION, {}).update("},{"line_number":66,"context_line":"                {\u0027action\u0027: self.action,"},{"line_number":67,"context_line":"                 \u0027grace_age\u0027: \"0\"})"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"            parser \u003d ConfigParser()"},{"line_number":70,"context_line":"            for section in (\u0027object-auditor\u0027, CONF_SECTION):"}],"source_content_type":"text/x-python","patch_set":3,"id":"0f51f6b6_35006b14","line":67,"in_reply_to":"23c5c0d6_92aaa92a","updated":"2021-06-03 06:13:24.000000000","message":"The probe test in LaunchPad bug 1925782 deals with an error condition that is covered by a different review, https://review.opendev.org/c/openstack/swift/+/792713\nI was going to get away with a unit test there though.","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"}],"test/unit/obj/test_auditor.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":1587,"context_line":"            if metadata is not None:"},{"line_number":1588,"context_line":"                metadata1.update(metadata)"},{"line_number":1589,"context_line":"            writer.put(metadata1)"},{"line_number":1590,"context_line":"            writer.close()"},{"line_number":1591,"context_line":""},{"line_number":1592,"context_line":"    def setUp(self):"},{"line_number":1593,"context_line":"        super(TestAuditWatchers, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"2596b37b_257474a8","line":1590,"updated":"2021-05-26 12:03:03.000000000","message":"I\u0027m not sure the close is needed - the create() context manager closes on exit\n\nBut writer.commit(timestamp) would be good for completeness (not strictly necessary for replica policies but needed for EC to make the file durable)","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"052b78533c1a8cd05052d4ac5af4383f1dbe3c30","unresolved":false,"context_lines":[{"line_number":1587,"context_line":"            if metadata is not None:"},{"line_number":1588,"context_line":"                metadata1.update(metadata)"},{"line_number":1589,"context_line":"            writer.put(metadata1)"},{"line_number":1590,"context_line":"            writer.close()"},{"line_number":1591,"context_line":""},{"line_number":1592,"context_line":"    def setUp(self):"},{"line_number":1593,"context_line":"        super(TestAuditWatchers, self).setUp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3ed1dd6b_a2d7d13b","line":1590,"in_reply_to":"2596b37b_257474a8","updated":"2021-06-03 06:13:24.000000000","message":"Done","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":1597,"context_line":"        self._put_test_file(\u0027c\u0027, 0, 1024, timestamp,"},{"line_number":1598,"context_line":"                            metadata\u003d{\u0027X-Object-Meta-Flavor\u0027: \u0027banana\u0027})"},{"line_number":1599,"context_line":"        self._put_test_file(\u0027c\u0027, 1, 2048, timestamp,"},{"line_number":1600,"context_line":"                            metadata\u003d{\u0027X-Object-Meta-Flavor\u0027: \u0027orange\u0027})"},{"line_number":1601,"context_line":""},{"line_number":1602,"context_line":"    def test_watchers(self):"},{"line_number":1603,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"96268fcf_7020283b","line":1600,"updated":"2021-05-26 12:03:03.000000000","message":"nice refactor, but we lost the use of different policies","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"052b78533c1a8cd05052d4ac5af4383f1dbe3c30","unresolved":true,"context_lines":[{"line_number":1597,"context_line":"        self._put_test_file(\u0027c\u0027, 0, 1024, timestamp,"},{"line_number":1598,"context_line":"                            metadata\u003d{\u0027X-Object-Meta-Flavor\u0027: \u0027banana\u0027})"},{"line_number":1599,"context_line":"        self._put_test_file(\u0027c\u0027, 1, 2048, timestamp,"},{"line_number":1600,"context_line":"                            metadata\u003d{\u0027X-Object-Meta-Flavor\u0027: \u0027orange\u0027})"},{"line_number":1601,"context_line":""},{"line_number":1602,"context_line":"    def test_watchers(self):"},{"line_number":1603,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b554f84b_b2e0d447","line":1600,"in_reply_to":"96268fcf_7020283b","updated":"2021-06-03 06:13:24.000000000","message":"Yeah, I\u0027m just going to un-re-factor it back, in view of your 3rd file.","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":1686,"context_line":"    def test_builtin_watchers(self):"},{"line_number":1687,"context_line":""},{"line_number":1688,"context_line":"        # Yep, back-channel signaling in tests."},{"line_number":1689,"context_line":"        sentiel \u003d \u0027DARK\u0027"},{"line_number":1690,"context_line":""},{"line_number":1691,"context_line":"        timestamp \u003d Timestamp(time.time())"},{"line_number":1692,"context_line":"        self._put_test_file(sentiel, 2, 1024, timestamp)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1de46ac3_b6904b58","line":1689,"range":{"start_line":1689,"start_character":8,"end_line":1689,"end_character":15},"updated":"2021-05-26 12:03:03.000000000","message":"nit: typo? sentinel?","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"052b78533c1a8cd05052d4ac5af4383f1dbe3c30","unresolved":false,"context_lines":[{"line_number":1686,"context_line":"    def test_builtin_watchers(self):"},{"line_number":1687,"context_line":""},{"line_number":1688,"context_line":"        # Yep, back-channel signaling in tests."},{"line_number":1689,"context_line":"        sentiel \u003d \u0027DARK\u0027"},{"line_number":1690,"context_line":""},{"line_number":1691,"context_line":"        timestamp \u003d Timestamp(time.time())"},{"line_number":1692,"context_line":"        self._put_test_file(sentiel, 2, 1024, timestamp)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f6ededa_43fac036","line":1689,"range":{"start_line":1689,"start_character":8,"end_line":1689,"end_character":15},"in_reply_to":"1de46ac3_b6904b58","updated":"2021-06-03 06:13:24.000000000","message":"Done","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":1688,"context_line":"        # Yep, back-channel signaling in tests."},{"line_number":1689,"context_line":"        sentiel \u003d \u0027DARK\u0027"},{"line_number":1690,"context_line":""},{"line_number":1691,"context_line":"        timestamp \u003d Timestamp(time.time())"},{"line_number":1692,"context_line":"        self._put_test_file(sentiel, 2, 1024, timestamp)"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":"        conf \u003d self.conf.copy()"}],"source_content_type":"text/x-python","patch_set":3,"id":"4c86414b_e2e7eca9","line":1691,"updated":"2021-05-26 12:03:03.000000000","message":"this is probably ok but might be safer to subtract a little from time() to guarantee that when compared with time.time() in the watcher there is a delta. At the moment the \u0027rounding\u0027 of the data file timestamp in the watcher pretty much does guarantee that, but if the full timestamp is used in the watcher the test might intermittently fail (?)","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6e67e44901c7f5e9dadc840ca00bd059c5c04c33","unresolved":true,"context_lines":[{"line_number":1688,"context_line":"        # Yep, back-channel signaling in tests."},{"line_number":1689,"context_line":"        sentiel \u003d \u0027DARK\u0027"},{"line_number":1690,"context_line":""},{"line_number":1691,"context_line":"        timestamp \u003d Timestamp(time.time())"},{"line_number":1692,"context_line":"        self._put_test_file(sentiel, 2, 1024, timestamp)"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":"        conf \u003d self.conf.copy()"}],"source_content_type":"text/x-python","patch_set":3,"id":"8e011dd9_6c4eb965","line":1691,"in_reply_to":"4c86414b_e2e7eca9","updated":"2021-06-03 16:25:01.000000000","message":"I am pretty sure the test you added makes this moot. Because of \u003e\u003d comparison in the watcher, the corner case is PUT being so super close to the current time that by the time watcher takes time.time(), it\u0027s still the same as the object timestamp. But with grace_age zero, it\u0027s still okay, we solidly report it. With grace_age of a week, we do not report it. The problematic case occurs when grace_age is small, comparable to the time it takes between putting the object and running the audit.","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":1688,"context_line":"        # Yep, back-channel signaling in tests."},{"line_number":1689,"context_line":"        sentiel \u003d \u0027DARK\u0027"},{"line_number":1690,"context_line":""},{"line_number":1691,"context_line":"        timestamp \u003d Timestamp(time.time())"},{"line_number":1692,"context_line":"        self._put_test_file(sentiel, 2, 1024, timestamp)"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":"        conf \u003d self.conf.copy()"}],"source_content_type":"text/x-python","patch_set":3,"id":"86699536_27afd0b9","line":1691,"in_reply_to":"8e011dd9_6c4eb965","updated":"2021-06-28 11:47:06.000000000","message":"my concern wast that file timestamp is t1 and time could still be t1 when comparing file timestamp + grace_age to time, but it is extremely unlikely and even less likely with the addition of the prior test with non-zero grace age. No change required.","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1accc641e8beafb69ca50014593e30f916eacc38","unresolved":true,"context_lines":[{"line_number":1727,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":1728,"context_line":"        self.assertIn("},{"line_number":1729,"context_line":"            \u0027[audit-watcher test_watcher1] total unknown 0 ok 2 dark 1\u0027,"},{"line_number":1730,"context_line":"            log_lines)"},{"line_number":1731,"context_line":""},{"line_number":1732,"context_line":""},{"line_number":1733,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"362e4811_ffd823ac","line":1730,"updated":"2021-05-26 12:03:03.000000000","message":"testing for no dark data with default grace age would be good","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"6e67e44901c7f5e9dadc840ca00bd059c5c04c33","unresolved":false,"context_lines":[{"line_number":1727,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":1728,"context_line":"        self.assertIn("},{"line_number":1729,"context_line":"            \u0027[audit-watcher test_watcher1] total unknown 0 ok 2 dark 1\u0027,"},{"line_number":1730,"context_line":"            log_lines)"},{"line_number":1731,"context_line":""},{"line_number":1732,"context_line":""},{"line_number":1733,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"04bfc455_38e5f3d0","line":1730,"in_reply_to":"362e4811_ffd823ac","updated":"2021-06-03 16:25:01.000000000","message":"Done","commit_id":"9ceae2dfd258b95684449737c34cd171f436dd76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1425bb7fedcbac02ce9362060dae3158322405","unresolved":true,"context_lines":[{"line_number":1773,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":1774,"context_line":"        self.assertIn("},{"line_number":1775,"context_line":"            \u0027[audit-watcher test_watcher1] total unknown 0 ok 4 dark 0\u0027,"},{"line_number":1776,"context_line":"            log_lines)"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"        # with grace_age\u003d0 the DARK object will be older than"},{"line_number":1779,"context_line":"        # grace_age so will be logged"}],"source_content_type":"text/x-python","patch_set":4,"id":"ad8b8d2d_9ad9a211","line":1776,"updated":"2021-06-09 20:26:08.000000000","message":"Backing out the change, this is where the test pops -- got \"ok 3 dark 1\" instead.","commit_id":"7d3592a82d96c5f010953bea42974da6a0baeb2e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"9f859e03265fc676dcab97b3e7b5ec2c552f492f","unresolved":true,"context_lines":[{"line_number":1773,"context_line":"        log_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":1774,"context_line":"        self.assertIn("},{"line_number":1775,"context_line":"            \u0027[audit-watcher test_watcher1] total unknown 0 ok 4 dark 0\u0027,"},{"line_number":1776,"context_line":"            log_lines)"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"        # with grace_age\u003d0 the DARK object will be older than"},{"line_number":1779,"context_line":"        # grace_age so will be logged"}],"source_content_type":"text/x-python","patch_set":4,"id":"88bbc34b_d05208cb","line":1776,"in_reply_to":"ad8b8d2d_9ad9a211","updated":"2021-06-10 13:26:19.000000000","message":"Ouch, you made me realize something. The overall test procedure happens to work because the next assert is for a different pattern. Both are present in the log by then. We should add self.logger.clear(). I imported this code uncritically when I squashed Allistair\u0027s add-on.","commit_id":"7d3592a82d96c5f010953bea42974da6a0baeb2e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":1757,"context_line":"        conf[\u0027__file__\u0027] \u003d \u0027/etc/swift/swift.conf\u0027"},{"line_number":1758,"context_line":""},{"line_number":1759,"context_line":"        # with default watcher config the DARK object will not be older than"},{"line_number":1760,"context_line":"        # grace_age so will not be logged"},{"line_number":1761,"context_line":"        ret_config \u003d {\u0027test_watcher1\u0027: {\u0027action\u0027: \u0027log\u0027}}"},{"line_number":1762,"context_line":"        with mock.patch(\u0027swift.obj.auditor.parse_prefixed_conf\u0027,"},{"line_number":1763,"context_line":"                        return_value\u003dret_config), \\"}],"source_content_type":"text/x-python","patch_set":5,"id":"9b4c2763_2da9d6a2","line":1760,"updated":"2021-06-28 11:47:06.000000000","message":"+1","commit_id":"a82e66e6ea9f1a96cdb3e6ce9e36047d656d40c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b3927ae50facc6fe3bacb21bf46f06af4051a65e","unresolved":true,"context_lines":[{"line_number":1775,"context_line":"            \u0027[audit-watcher test_watcher1] total unknown 0 ok 4 dark 0\u0027,"},{"line_number":1776,"context_line":"            log_lines)"},{"line_number":1777,"context_line":""},{"line_number":1778,"context_line":"        self.logger.clear()"},{"line_number":1779,"context_line":"        # with grace_age\u003d0 the DARK object will be older than"},{"line_number":1780,"context_line":"        # grace_age so will be logged"},{"line_number":1781,"context_line":"        ret_config \u003d {\u0027test_watcher1\u0027: {\u0027action\u0027: \u0027log\u0027, \u0027grace_age\u0027: \u00270\u0027}}"}],"source_content_type":"text/x-python","patch_set":5,"id":"cfe25740_325c70a2","line":1778,"updated":"2021-06-28 11:47:06.000000000","message":"+1 good catch","commit_id":"a82e66e6ea9f1a96cdb3e6ce9e36047d656d40c6"}]}
