)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6f7a8ff935628c512fab1a89b17daaae2a809f89","unresolved":false,"context_lines":[{"line_number":11,"context_line":"implementation, ValueError is catched and handled when expirer\u0027s task"},{"line_number":12,"context_line":"objects have invalid name. But in actual swift cluster, invalid task"},{"line_number":13,"context_line":"object name is not created because task object is created by"},{"line_number":14,"context_line":"object-server."},{"line_number":15,"context_line":"However, without the ValueError catching, some unit tests fail,"},{"line_number":16,"context_line":"because the unit tests create invalid task object names."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa0c359_8db03145","line":14,"updated":"2018-02-22 22:12:22.000000000","message":"Seems a too optimistic...","commit_id":"0c9cd9b8713634c4a377106a481987a337b5e04e"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2d564ee1ed609bb7b3ed939b9064e8ecf2dc3838","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Kazuhiro MIYAHARA \u003cmiyahara.kazuhiro@lab.ntt.co.jp\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-02-26 16:10:40 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix expirer\u0027s invalid task object names in unit tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Object-expirer\u0027s task name should be in format of"},{"line_number":10,"context_line":"\"\u003ctimestamp\u003e-\u003caccount\u003e/\u003ccontainer\u003e/\u003cobj\u003e\". In object-expirer"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa0c359_e43c39c9","line":7,"range":{"start_line":7,"start_character":1,"end_line":7,"end_character":53},"updated":"2018-02-26 17:02:20.000000000","message":"Actually, this fixes not only unit tests but the code to avoid invalid tasks to be cached but the code works fine as I expected so it\u0027s ok to get it merged.","commit_id":"b3f1558acd2f5a4df3f039070ca5bbc33935e822"}],"swift/obj/expirer.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27c7094c0cae5ba4ba952d30ce6d293a3f38f9c8","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                    split_path(\u0027/\u0027 + target_path, 3, 3, True)"},{"line_number":136,"context_line":"                cache_key \u003d \u0027%s/%s\u0027 % (target_account, target_container)"},{"line_number":137,"context_line":"            except ValueError:"},{"line_number":138,"context_line":"                cache_key \u003d None"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"            obj_cache[cache_key].append((task_container, task_obj))"},{"line_number":141,"context_line":"            cnt +\u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_feb3cfe7","side":"PARENT","line":138,"updated":"2018-02-21 05:53:34.000000000","message":"+100","commit_id":"12989342af5352b4f906457e64d2d76e5b5cdc50"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6f7a8ff935628c512fab1a89b17daaae2a809f89","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        for delete_task in task_iter:"},{"line_number":118,"context_line":"            target_account, target_container, _junk \u003d \\"},{"line_number":119,"context_line":"                split_path(\u0027/\u0027 + delete_task[\u0027target_path\u0027], 3, 3, True)"},{"line_number":120,"context_line":"            cache_key \u003d \u0027%s/%s\u0027 % (target_account, target_container)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"            obj_cache[cache_key].append(delete_task)"},{"line_number":123,"context_line":"            cnt +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_cd3e398a","line":120,"updated":"2018-02-22 22:12:22.000000000","message":"I don\u0027t know... loops that do work on a list have a tendency to blow up and stop making progress until there\u0027s some manual intervention...\n\nI have a strong preference for the pattern of:\n\n    for task in work:\n        try:\n            handle_job(task)\n        except Exception:\n            logging.exception(\u0027Unexpected error handling task %r\u0027, task)\n        else:\n            remove_job(task)\n\nAnytime we can get away with it...","commit_id":"0c9cd9b8713634c4a377106a481987a337b5e04e"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"9a5869d41ca8beab254dd8c59df4aebbd9e7f7ba","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        for delete_task in task_iter:"},{"line_number":118,"context_line":"            target_account, target_container, _junk \u003d \\"},{"line_number":119,"context_line":"                split_path(\u0027/\u0027 + delete_task[\u0027target_path\u0027], 3, 3, True)"},{"line_number":120,"context_line":"            cache_key \u003d \u0027%s/%s\u0027 % (target_account, target_container)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"            obj_cache[cache_key].append(delete_task)"},{"line_number":123,"context_line":"            cnt +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_6e48385b","line":120,"in_reply_to":"3fa0c359_cd3e398a","updated":"2018-02-23 06:22:19.000000000","message":"OK, I added try-except again.\nBut \"cache_key \u003d None\" is not reverted and I added logging and skipping instead. Because if target_path is invalid, the task cannot be executed.","commit_id":"0c9cd9b8713634c4a377106a481987a337b5e04e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a6ce00fd89258b0b92ffa80493d7b20ee70e98f1","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    split_path(\u0027/\u0027 + delete_task[\u0027target_path\u0027], 3, 3, True)"},{"line_number":121,"context_line":"                cache_key \u003d \u0027%s/%s\u0027 % (target_account, target_container)"},{"line_number":122,"context_line":"            except ValueError:"},{"line_number":123,"context_line":"                self.logger.exception(\u0027Unexcepted error handling task %r\u0027 %"},{"line_number":124,"context_line":"                                      delete_task)"},{"line_number":125,"context_line":"                continue"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_eb03cb0b","line":123,"range":{"start_line":123,"start_character":28,"end_line":123,"end_character":37},"updated":"2018-02-23 17:51:54.000000000","message":"Logging at error is probably sufficient -- we already know exactly where we expect this traceback to end.","commit_id":"10ef5325e4e3a41c2dce1cd6dfdf1b3516cba0a7"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"4de000faa7d56b19ed7f37d7ec82fdb08dcf366e","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    split_path(\u0027/\u0027 + delete_task[\u0027target_path\u0027], 3, 3, True)"},{"line_number":121,"context_line":"                cache_key \u003d \u0027%s/%s\u0027 % (target_account, target_container)"},{"line_number":122,"context_line":"            except ValueError:"},{"line_number":123,"context_line":"                self.logger.exception(\u0027Unexcepted error handling task %r\u0027 %"},{"line_number":124,"context_line":"                                      delete_task)"},{"line_number":125,"context_line":"                continue"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            obj_cache[cache_key].append(delete_task)"},{"line_number":128,"context_line":"            cnt +\u003d 1"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_14d716c1","line":125,"range":{"start_line":123,"start_character":0,"end_line":125,"end_character":24},"updated":"2018-02-26 15:09:05.000000000","message":"Missing coverage for those lines.","commit_id":"10ef5325e4e3a41c2dce1cd6dfdf1b3516cba0a7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"3724eced0439abafc44b47167f04b14914ab22f6","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    split_path(\u0027/\u0027 + delete_task[\u0027target_path\u0027], 3, 3, True)"},{"line_number":121,"context_line":"                cache_key \u003d \u0027%s/%s\u0027 % (target_account, target_container)"},{"line_number":122,"context_line":"            except ValueError:"},{"line_number":123,"context_line":"                self.logger.exception(\u0027Unexcepted error handling task %r\u0027 %"},{"line_number":124,"context_line":"                                      delete_task)"},{"line_number":125,"context_line":"                continue"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            obj_cache[cache_key].append(delete_task)"},{"line_number":128,"context_line":"            cnt +\u003d 1"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_41707fa4","line":125,"range":{"start_line":123,"start_character":0,"end_line":125,"end_character":24},"in_reply_to":"3fa0c359_14d716c1","updated":"2018-02-26 16:14:21.000000000","message":"Done","commit_id":"10ef5325e4e3a41c2dce1cd6dfdf1b3516cba0a7"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"3724eced0439abafc44b47167f04b14914ab22f6","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            except (Exception, Timeout):"},{"line_number":246,"context_line":"                self.logger.exception(_(\u0027Unhandled exception\u0027))"},{"line_number":247,"context_line":"            elapsed \u003d time() - begin"},{"line_number":248,"context_line":"            if elapsed \u003c self.interval:"},{"line_number":249,"context_line":"                sleep(random() * (self.interval - elapsed))"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def get_process_values(self, kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_c1b00f43","line":248,"range":{"start_line":248,"start_character":12,"end_line":248,"end_character":39},"updated":"2018-02-26 16:14:21.000000000","message":"Test coverage is now 99% because this if-clause is tested partially.\nBut I think this is not target of this patch.","commit_id":"b3f1558acd2f5a4df3f039070ca5bbc33935e822"}],"test/unit/obj/test_expirer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6f7a8ff935628c512fab1a89b17daaae2a809f89","unresolved":false,"context_lines":[{"line_number":589,"context_line":"            \u0027delete actual object: \u0027 % (cts, ots),"},{"line_number":590,"context_line":"            \u0027Exception while deleting object %d %d-a/c/actual-obj failed to \u0027"},{"line_number":591,"context_line":"            \u0027delete actual object: \u0027 % (cts + 1, ots),"},{"line_number":592,"context_line":"            \u0027Exception while deleting object %d %d-a/c/next-obj failed to \u0027"},{"line_number":593,"context_line":"            \u0027delete actual object: \u0027 % (cts + 1, ots),"},{"line_number":594,"context_line":"            \u0027Exception while deleting container %d failed to delete \u0027"},{"line_number":595,"context_line":"            \u0027container: \u0027 % (cts,),"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_8d4cb142","line":592,"updated":"2018-02-22 22:12:22.000000000","message":"this is great, anytime the stubs can more closely match the reals I\u0027m strongly in favor!","commit_id":"0c9cd9b8713634c4a377106a481987a337b5e04e"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2d564ee1ed609bb7b3ed939b9064e8ecf2dc3838","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        result \u003d list(x.round_robin_order(task_con_obj_list))"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"        # the invalid task objects are ignored"},{"line_number":377,"context_line":"        expected \u003d ["},{"line_number":378,"context_line":"            make_task(\u00270000\u0027, \u0027a/c0/o0\u0027),"},{"line_number":379,"context_line":"            make_task(\u00270001\u0027, \u0027a/c1/o0\u0027),"},{"line_number":380,"context_line":"            make_task(\u00270002\u0027, \u0027a/c2/o0\u0027),"},{"line_number":381,"context_line":"            make_task(\u00270000\u0027, \u0027a/c0/o1\u0027),"},{"line_number":382,"context_line":"            make_task(\u00270001\u0027, \u0027a/c1/o1\u0027),"},{"line_number":383,"context_line":"            make_task(\u00270002\u0027, \u0027a/c2/o1\u0027),"},{"line_number":384,"context_line":"        ]"},{"line_number":385,"context_line":"        self.assertEqual(expected, result)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        # for a given target container, tasks won\u0027t necessarily all go in"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_a104e318","line":384,"range":{"start_line":377,"start_character":0,"end_line":384,"end_character":9},"updated":"2018-02-26 17:02:20.000000000","message":"I thought we could remove this definition because it\u0027s same with the previous one. However, it seems okay to find what\u0027s expected for each assertion. perhaps dividing the tests to get one mean for each would be nice to have tho.","commit_id":"b3f1558acd2f5a4df3f039070ca5bbc33935e822"}]}
