)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16233,"name":"Mauricio Lima","email":"mauriciolimab@gmail.com","username":"limamauricio"},"change_message_id":"1f9d8a0a30c0ed8999c9bf3beeba04fa31aed94e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"cross region replication."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Closes bug #1408061"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"Change-Id: I40d107c567f02e219f04b1a74d7060f5280432d5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7a016987_069b1a74","line":36,"updated":"2015-05-25 14:16:29.000000000","message":"Commit message structure is not right. Change Closes bug #1408061 to Closes-Bug: #1408061","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"}],"swift/obj/replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"739a9259c64debf5ddde971efe57c8d26af0c005","unresolved":false,"context_lines":[{"line_number":262,"context_line":"                                node[\u0027device\u0027], job[\u0027partition\u0027], \u0027REPLICATE\u0027,"},{"line_number":263,"context_line":"                                \u0027/\u0027 + \u0027-\u0027.join(suffixes), headers\u003dself.headers)"},{"line_number":264,"context_line":"                            conn.getresponse().read()"},{"line_number":265,"context_line":"                        if cand_objs is not None:"},{"line_number":266,"context_line":"                            if delete_objs is not None:"},{"line_number":267,"context_line":"                                delete_objs \u003d delete_objs.intersection("},{"line_number":268,"context_line":"                                    cand_objs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_1d4923b7","line":265,"updated":"2015-02-25 01:23:58.000000000","message":"hrmm... I\u0027m not sure the handling is quite right here...\n\nafter the first sync to a local region, ssync will return cand_objs but we should still do a full sync to the first remote region - unless we\u0027re counting on the primary to handle that...\n\nI\u0027m going to put this WIP, I think i\u0027m missing a test.","commit_id":"3afe58174ff7ae0af3b555482a74cbc802bbd316"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b624d03d4816f810a19c6283545f1e7b99b87295","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                                     len(delete_objs))"},{"line_number":279,"context_line":"                    self.delete_handoff_objs(job, delete_objs)"},{"line_number":280,"context_line":"                elif self.conf.get(\u0027sync_method\u0027) \u003d\u003d \u0027rsync\u0027:"},{"line_number":281,"context_line":"                    self.delete_partition(job[\u0027path\u0027])"},{"line_number":282,"context_line":"            elif not suffixes:"},{"line_number":283,"context_line":"                self.delete_partition(job[\u0027path\u0027])"},{"line_number":284,"context_line":"        except (Exception, Timeout):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_92b87212","side":"PARENT","line":281,"updated":"2015-02-25 21:08:19.000000000","message":"this is the dangling elif i keep talk about\n\ndelete_obj is almost always going to be falsy with a single region, so if you\u0027re not running rsync how does the part/suffix get cleaned up?","commit_id":"a14cf43c47f3c014f5d65735a82c28350112abfe"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"48c7e71bd5ca4448f8396aef1c42458f10fbdff2","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        remote_check_objs \u003d None"},{"line_number":251,"context_line":"                    else:"},{"line_number":252,"context_line":"                        remote_check_objs \u003d delete_objs"},{"line_number":253,"context_line":"                    # cand_objs is a list of in-sync objects"},{"line_number":254,"context_line":"                    success, cand_objs \u003d self.sync("},{"line_number":255,"context_line":"                        node, job, suffixes,"},{"line_number":256,"context_line":"                        remote_check_objs\u003dremote_check_objs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_55f7c4d2","line":253,"updated":"2015-02-25 21:57:37.000000000","message":"can we not use cand_objs then and maybe in_sync_objs instead?   also its a set (not a list) right?","commit_id":"665ade87fb257dbbd9d3493aa6c3fd311b802ca8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"14ed48a8615cc156105fcaeb9ff300cc53a28d09","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        remote_check_objs \u003d None"},{"line_number":251,"context_line":"                    else:"},{"line_number":252,"context_line":"                        remote_check_objs \u003d delete_objs"},{"line_number":253,"context_line":"                    # cand_objs is a list of in-sync objects"},{"line_number":254,"context_line":"                    success, cand_objs \u003d self.sync("},{"line_number":255,"context_line":"                        node, job, suffixes,"},{"line_number":256,"context_line":"                        remote_check_objs\u003dremote_check_objs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_38b32799","line":253,"in_reply_to":"ba7be1f8_55f7c4d2","updated":"2015-02-25 22:16:12.000000000","message":"yeah i just carried that over the list part from the previous comment which was left over from a previous implementation that used a list.\n\nit\u0027s possible cand_objs (short for candidate_objects) maybe doesn\u0027t convey all the context available, but I\u0027m not sure it\u0027s really in_sync_objs either (from the perspective of this function) since we don\u0027t know what\u0027s really in-sync until we talk to all nodes... that\u0027s probably better than nothing though.","commit_id":"665ade87fb257dbbd9d3493aa6c3fd311b802ca8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b624d03d4816f810a19c6283545f1e7b99b87295","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                                delete_objs \u003d delete_objs.intersection("},{"line_number":274,"context_line":"                                    cand_objs)"},{"line_number":275,"context_line":"                            else:"},{"line_number":276,"context_line":"                                delete_objs \u003d cand_objs"},{"line_number":277,"context_line":"                    responses.append(success)"},{"line_number":278,"context_line":"                if self.handoff_delete:"},{"line_number":279,"context_line":"                    # delete handoff if we have had handoff_delete successes"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_2cbdb0b7","line":276,"updated":"2015-02-25 21:08:19.000000000","message":"so technically cand_objs is always a subset of delete_objs, so the intersection call is actually equivalent to the assignment - but that only works because we know\n\n  a) delete_objs \u003d\u003d remote_check_objs when node.region !\u003d job.region\n  b) ssync will returns remote_check_objs - send_list\n  c) rsync always returns None\n\nSeems like a lot of context, for this path to rely on.  This seems more obviously correct without having to trust those external behaviors.\n\nAnytime we talk to a remote region we start to carry around this set of hashes that\u0027s in-sync.  If we talk to another remote region we\u0027ll send it this list of objects to check and anything that it doesn\u0027t ask for is considered in-sync so we\u0027ll cut our list down to those and carry that forward - then assuming all (or handoff) connections were successful - we\u0027ll delete only in-sync objects.","commit_id":"665ade87fb257dbbd9d3493aa6c3fd311b802ca8"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"48c7e71bd5ca4448f8396aef1c42458f10fbdff2","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                                delete_objs \u003d delete_objs.intersection("},{"line_number":274,"context_line":"                                    cand_objs)"},{"line_number":275,"context_line":"                            else:"},{"line_number":276,"context_line":"                                delete_objs \u003d cand_objs"},{"line_number":277,"context_line":"                    responses.append(success)"},{"line_number":278,"context_line":"                if self.handoff_delete:"},{"line_number":279,"context_line":"                    # delete handoff if we have had handoff_delete successes"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_95f69c5b","line":276,"in_reply_to":"ba7be1f8_2cbdb0b7","updated":"2015-02-25 21:57:37.000000000","message":"wait, isn\u0027t it the other way around?  delete_objs is aways a subset of cand_obj? not that its super important but want to make sure I understand everything you\u0027re saying","commit_id":"665ade87fb257dbbd9d3493aa6c3fd311b802ca8"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"14ed48a8615cc156105fcaeb9ff300cc53a28d09","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                                delete_objs \u003d delete_objs.intersection("},{"line_number":274,"context_line":"                                    cand_objs)"},{"line_number":275,"context_line":"                            else:"},{"line_number":276,"context_line":"                                delete_objs \u003d cand_objs"},{"line_number":277,"context_line":"                    responses.append(success)"},{"line_number":278,"context_line":"                if self.handoff_delete:"},{"line_number":279,"context_line":"                    # delete handoff if we have had handoff_delete successes"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_d8668b50","line":276,"in_reply_to":"ba7be1f8_95f69c5b","updated":"2015-02-25 22:16:12.000000000","message":"well this code enforces that delete_objs is always a subset of cand_objs, yes - which I think is important for clarity.  But, no, what was trying to point out was that cand_objs is also a subset of delete_objs but only because delete_objs was offered to the remote region as remote_check_objs and cand_objs is always a subset of remote_check_objs because of an ssync implementation detail to only offer what it receives as remote_check_objs.  Therefore, the value it returns as in-sync objects is always a subset of that filtering.  So the delete_objs.intersection(cand_objs) is equivalent to delete_objs \u003d cand_objs because of the way ssync handles remote_check_objs and the way we call ssync.\n\nTrying to say the same thing again:\n\nWe start by syncing everything (remote_check_objs\u003dNone) and get back a list of available (which have all either in-sync or out-of-date) and this code puts that in delete_objs, then the next pass offers the next remote region (if there is one) those objects and cuts it down to only what\u0027s in sync with the next remote region until delete_objs is only what\u0027s either been synced or is already in-sync with all regions.","commit_id":"665ade87fb257dbbd9d3493aa6c3fd311b802ca8"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"239dc9e5e80f01ba7ba7df19ff0281ea63d69b20","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                args.append(spath)"},{"line_number":199,"context_line":"                had_any \u003d True"},{"line_number":200,"context_line":"        if not had_any:"},{"line_number":201,"context_line":"            return False, set()"},{"line_number":202,"context_line":"        data_dir \u003d get_data_dir(job[\u0027policy_idx\u0027])"},{"line_number":203,"context_line":"        args.append(join(rsync_module, node[\u0027device\u0027],"},{"line_number":204,"context_line":"                    data_dir, job[\u0027partition\u0027]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_2a1f866d","line":201,"updated":"2015-03-03 10:07:58.000000000","message":"nit pick: to keep my comment\u0027s consistency on ssync_sender this is an error case so it\u0027s better to use None instead of set().","commit_id":"6c52b7dccc3bd10958adee3a991e48c50bfdc7e3"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2aba648d05ca946ef65cf8c53ae8a87b89738f47","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        args.append(join(rsync_module, node[\u0027device\u0027],"},{"line_number":204,"context_line":"                    data_dir, job[\u0027partition\u0027]))"},{"line_number":205,"context_line":"        if self._rsync(args) \u003d\u003d 0:"},{"line_number":206,"context_line":"            return True, remote_check_objs"},{"line_number":207,"context_line":"        else:"},{"line_number":208,"context_line":"            return False, None"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_9f2c5004","line":206,"updated":"2015-03-06 09:03:35.000000000","message":"Is remote_check_objs always None?\n\nremote_check_objs is an intersection of cand_objs but rsync  seems to never return non-empty cand_objs set.","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f75985d7d9ea23a7466db3273e3711e92b6f268f","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        args.append(join(rsync_module, node[\u0027device\u0027],"},{"line_number":204,"context_line":"                    data_dir, job[\u0027partition\u0027]))"},{"line_number":205,"context_line":"        if self._rsync(args) \u003d\u003d 0:"},{"line_number":206,"context_line":"            return True, remote_check_objs"},{"line_number":207,"context_line":"        else:"},{"line_number":208,"context_line":"            return False, None"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_955f68e4","line":206,"in_reply_to":"9a80dd14_9f2c5004","updated":"2015-03-20 20:11:16.000000000","message":"well, yes, in practice it\u0027s alway None for rsync because you can\u0027t have some ssync and rsync nodes (maybe someday?) - but I thought it was more clear to let the passed in value value fall through on success (as indicated in the docstring) *because* if the caller ever *did* pass in a set of objects it would like us to validate are in sync with a remote region - well after a successful rysnc all of the objects in remote_check_objs (and more probably) are fully in sync with the remote region - there\u0027s no way to prevent the transfer and only return the subset of objects which the remote end already has - so we just let rsync do what it does and by returning the passed in \"set\" we preserve the ssync semantic.\n\nRight?\n\nIs it just easier to for rsync to always return None explicitly and swallow the passed in value?  I think you really have to be outside of the context of this function to see that it\u0027s ok to return None because you are always passed None - so this seems clearer when you just consider just this unit.  To *me* :P","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2aba648d05ca946ef65cf8c53ae8a87b89738f47","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                                delete_objs \u003d delete_objs.intersection("},{"line_number":274,"context_line":"                                    cand_objs)"},{"line_number":275,"context_line":"                            else:"},{"line_number":276,"context_line":"                                delete_objs \u003d cand_objs"},{"line_number":277,"context_line":"                    responses.append(success)"},{"line_number":278,"context_line":"                if self.handoff_delete:"},{"line_number":279,"context_line":"                    # delete handoff if we have had handoff_delete successes"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_9c2c5e04","line":276,"updated":"2015-03-06 09:03:35.000000000","message":"delete_objs is always updated, here. And then, given to remoete_check_objs when the remote is not local.\n\nHum...this means the object synced to another region once will be never synced any other nodes in the non-local region, right?\n(i.e. handoff (this) replicator expects primary (at remote) replicator to sync asynchronously any other regions)\n\nIt seems nice to me for reducing network transfer from handoff nodes but I\u0027m not sure we really don\u0027t have to sync to each region because primary ensures full sync at least once to each region.","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f75985d7d9ea23a7466db3273e3711e92b6f268f","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                                delete_objs \u003d delete_objs.intersection("},{"line_number":274,"context_line":"                                    cand_objs)"},{"line_number":275,"context_line":"                            else:"},{"line_number":276,"context_line":"                                delete_objs \u003d cand_objs"},{"line_number":277,"context_line":"                    responses.append(success)"},{"line_number":278,"context_line":"                if self.handoff_delete:"},{"line_number":279,"context_line":"                    # delete handoff if we have had handoff_delete successes"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_15cb7853","line":276,"in_reply_to":"9a80dd14_9c2c5e04","updated":"2015-03-20 20:11:16.000000000","message":"so the situation is three primaries in three *different* remote regions and this one in a handoff that\u0027s remote to all of those.\n\nSo we sync once - to one remote region - and with a stable node order - we\u0027ll never push to any other primary location as long as that primary is up and in sync.\n\nYeah I think I like that better(ish) than just shipping the object across the wan to every remote region - I think I\u0027d have a harder time describing that behavior to someone as \"efficient cross region replication\".\n\nThe followup patch to this one does some shuffling to make sure that even if no-one else is awake and replicating that even just this one guy can *eventually* get it pushed off of himself to all the right locations.  Probably at the expense of extra WAN traffic.  :\\","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"239dc9e5e80f01ba7ba7df19ff0281ea63d69b20","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        None on failure)."},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        if not self.suffixes:"},{"line_number":65,"context_line":"            return True, set()"},{"line_number":66,"context_line":"        try:"},{"line_number":67,"context_line":"            # Double try blocks in case our main error handler fails."},{"line_number":68,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_2a8066bf","line":65,"updated":"2015-03-03 10:07:58.000000000","message":"nit pick: I prefer to use self.available_set instead of set() because this method returns a set if succeed. This set is initialized in __init__ and uses it following. So we don\u0027t need to create new one.\n \nreturn True, self.available_set","commit_id":"6c52b7dccc3bd10958adee3a991e48c50bfdc7e3"},{"author":{"_account_id":12193,"name":"Hisashi Osanai","email":"osanai.hisashi@jp.fujitsu.com","username":"ho"},"change_message_id":"239dc9e5e80f01ba7ba7df19ff0281ea63d69b20","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            # This particular exception handler does the minimal amount as it"},{"line_number":116,"context_line":"            # would only get called if the above except Exception handler"},{"line_number":117,"context_line":"            # failed (bad node or job data)."},{"line_number":118,"context_line":"            self.daemon.logger.exception(\u0027EXCEPTION in replication.Sender\u0027)"},{"line_number":119,"context_line":"        return False, set()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def connect(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_2ada264c","line":118,"updated":"2015-03-03 10:07:58.000000000","message":"nit pick: this step is an error case so it\u0027s better to use None instead of set() for consistency.\n\nreturn False, None","commit_id":"6c52b7dccc3bd10958adee3a991e48c50bfdc7e3"}],"test/unit/obj/test_replicator.py":[{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"372df38ea86395d6a3d7a04411c8c105548b8d57","unresolved":false,"context_lines":[{"line_number":470,"context_line":"             \u0027region\u0027: 1, \u0027ip\u0027: \u0027fe80::202:b3ff:fe1e:8329\u0027, \u0027port\u0027: 6000},"},{"line_number":471,"context_line":"            {\u0027id\u0027: 6, \u0027device\u0027: \u0027sda\u0027, \u0027zone\u0027: 7, \u0027region\u0027: 1,"},{"line_number":472,"context_line":"             \u0027ip\u0027: \u00272001:0db8:85a3:0000:0000:8a2e:0370:7334\u0027, \u0027port\u0027: 6000},"},{"line_number":473,"context_line":"        ]"},{"line_number":474,"context_line":"        _create_test_rings(self.testdir, devs\u003ddevs)"},{"line_number":475,"context_line":"        self.conf[\u0027sync_method\u0027] \u003d \u0027ssync\u0027"},{"line_number":476,"context_line":"        self.replicator \u003d object_replicator.ObjectReplicator(self.conf)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_f90158b0","line":473,"updated":"2015-02-27 01:28:20.000000000","message":"the answer is probably going to make me slap my forehead but why recreate the rings here and what\u0027s the difference in the devs here vs test case setup?","commit_id":"b6f7f11a72d0799f1b672cc7c74552c5fb4be8a5"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"372df38ea86395d6a3d7a04411c8c105548b8d57","unresolved":false,"context_lines":[{"line_number":499,"context_line":"            self.assertFalse(os.access(whole_path_from, os.F_OK))"},{"line_number":500,"context_line":"            self.assertFalse(os.access(suffix_dir_path, os.F_OK))"},{"line_number":501,"context_line":"            self.assertTrue(os.access(part_path, os.F_OK))"},{"line_number":502,"context_line":"            # second pass should clean up the part"},{"line_number":503,"context_line":"            self.replicator.replicate()"},{"line_number":504,"context_line":"            self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":505,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_de72bae2","line":502,"updated":"2015-02-27 01:28:20.000000000","message":"should or will?  :)","commit_id":"b6f7f11a72d0799f1b672cc7c74552c5fb4be8a5"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2aba648d05ca946ef65cf8c53ae8a87b89738f47","unresolved":false,"context_lines":[{"line_number":806,"context_line":"                for line in info_lines:"},{"line_number":807,"context_line":"                    if \u0027partitions replicated in\u0027 not in line:"},{"line_number":808,"context_line":"                        non_status_info_lines.append(line)"},{"line_number":809,"context_line":"                self.assertEqual(non_status_info_lines, [\u0027Removing 1 objects\u0027])"},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"                self.replicator.logger._clear()"},{"line_number":812,"context_line":"                mock_rmdir.reset_mock()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ba7da2e9","line":809,"updated":"2015-03-06 09:03:35.000000000","message":"Tests looks reasonable to me but if we could improve more, I wonder if you could add an assert that \"Unexpected error trying to cleanup suffix dir (%r): \" won\u0027t appear here.\n?Staying this is ok because I could add it, later)","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f75985d7d9ea23a7466db3273e3711e92b6f268f","unresolved":false,"context_lines":[{"line_number":806,"context_line":"                for line in info_lines:"},{"line_number":807,"context_line":"                    if \u0027partitions replicated in\u0027 not in line:"},{"line_number":808,"context_line":"                        non_status_info_lines.append(line)"},{"line_number":809,"context_line":"                self.assertEqual(non_status_info_lines, [\u0027Removing 1 objects\u0027])"},{"line_number":810,"context_line":""},{"line_number":811,"context_line":"                self.replicator.logger._clear()"},{"line_number":812,"context_line":"                mock_rmdir.reset_mock()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d58000c1","line":809,"in_reply_to":"9a80dd14_ba7da2e9","updated":"2015-03-20 20:11:16.000000000","message":"I don\u0027t generally care to assert negatives, because you have to hack the code to trip them to make sure they\u0027re working like you expect.\n\n... but maybe?\n\nI guess there wouldn\u0027t be any error log lines?","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2aba648d05ca946ef65cf8c53ae8a87b89738f47","unresolved":false,"context_lines":[{"line_number":991,"context_line":"                    success \u003d True"},{"line_number":992,"context_line":"                else:"},{"line_number":993,"context_line":"                    success \u003d False"},{"line_number":994,"context_line":"                return success, set(ret_val)"},{"line_number":995,"context_line":""},{"line_number":996,"context_line":"            self.replicator.sync_method \u003d _fake_ssync"},{"line_number":997,"context_line":"            self.replicator.replicate()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_757dfdb0","line":994,"updated":"2015-03-06 09:03:35.000000000","message":"On Failure case, ret_val will be None (not set), I guess.","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f75985d7d9ea23a7466db3273e3711e92b6f268f","unresolved":false,"context_lines":[{"line_number":991,"context_line":"                    success \u003d True"},{"line_number":992,"context_line":"                else:"},{"line_number":993,"context_line":"                    success \u003d False"},{"line_number":994,"context_line":"                return success, set(ret_val)"},{"line_number":995,"context_line":""},{"line_number":996,"context_line":"            self.replicator.sync_method \u003d _fake_ssync"},{"line_number":997,"context_line":"            self.replicator.replicate()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_f55a6480","line":994,"in_reply_to":"9a80dd14_757dfdb0","updated":"2015-03-20 20:11:16.000000000","message":"oh yeah, not such a good fake i suppose.","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2aba648d05ca946ef65cf8c53ae8a87b89738f47","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"            self.assertFalse(os.access(whole_path_from, os.F_OK))"},{"line_number":1065,"context_line":"            self.assertFalse(os.access(suffix_dir_path, os.F_OK))"},{"line_number":1066,"context_line":"            self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"    def test_delete_objs_rsync_with_failures(self):"},{"line_number":1069,"context_line":"        self.replicator.logger \u003d debug_logger(\u0027test-replicator\u0027)"},{"line_number":1070,"context_line":"        with mock.patch(\u0027swift.obj.replicator.http_connect\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d0587734","line":1067,"updated":"2015-03-06 09:03:35.000000000","message":"Need \"del self.call_nums\" as same as other tests to make self.call_nums to be independent from any other tests.\n\nThough I wanna make it simpler but currently we should do that to be safe.","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"2aba648d05ca946ef65cf8c53ae8a87b89738f47","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"            self.replicator.replicate()"},{"line_number":1113,"context_line":"            self.assertFalse(os.access(whole_path_from, os.F_OK))"},{"line_number":1114,"context_line":"            self.assertFalse(os.access(suffix_dir_path, os.F_OK))"},{"line_number":1115,"context_line":"            self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":"    def test_delete_partition_ssync_with_cleanup_failure(self):"},{"line_number":1118,"context_line":"        with mock.patch(\u0027swift.obj.replicator.http_connect\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d0a6b70f","line":1115,"updated":"2015-03-06 09:03:35.000000000","message":"Same as above, please delete self.call_nums.","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f75985d7d9ea23a7466db3273e3711e92b6f268f","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"            self.replicator.replicate()"},{"line_number":1113,"context_line":"            self.assertFalse(os.access(whole_path_from, os.F_OK))"},{"line_number":1114,"context_line":"            self.assertFalse(os.access(suffix_dir_path, os.F_OK))"},{"line_number":1115,"context_line":"            self.assertFalse(os.access(part_path, os.F_OK))"},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":"    def test_delete_partition_ssync_with_cleanup_failure(self):"},{"line_number":1118,"context_line":"        with mock.patch(\u0027swift.obj.replicator.http_connect\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_95ef6886","line":1115,"in_reply_to":"9a80dd14_d0a6b70f","updated":"2015-03-20 20:11:16.000000000","message":"yeah i should just do it in tearDown","commit_id":"69f5ea9c2150fb1b222dbba191b21b0fe658231a"}]}
