)]}'
{"swift/obj/ssync_receiver.py":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"0ec383ba39838446c6da84d0532d8c54bf9c07f9","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                        \u0027DELETE subrequest with content-length %s\u0027 % path)"},{"line_number":334,"context_line":"                if POLICY_INDEX.lower() not in replication_headers:"},{"line_number":335,"context_line":"                        raise Exception("},{"line_number":336,"context_line":"                            \u0027DELETE subrequest sent without policy index\u0027)"},{"line_number":337,"context_line":"            elif method \u003d\u003d \u0027PUT\u0027:"},{"line_number":338,"context_line":"                if content_length is None:"},{"line_number":339,"context_line":"                    raise Exception("}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2FePc%3D","line":336,"updated":"2014-03-05 21:46:18.000000000","message":"Does this mean one can never run ssync where two or more nodes are not running code for storage policies and later?\n\nDoes that impact the upgrade story for those systems using ssync?","commit_id":"9312d2a3a7d6b4a9d91c3e1d7c4a9ee427f35275"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"abbed260995e89b27a428c00c60fd903f9532e21","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                break"},{"line_number":227,"context_line":"            msg_parms \u003d [urllib.unquote(v) for v in line.split()]"},{"line_number":228,"context_line":"            if len(msg_parms) \u003d\u003d 3:"},{"line_number":229,"context_line":"                (object_hash, timestamp, policy_idx) \u003d msg_parms"},{"line_number":230,"context_line":"            else:"},{"line_number":231,"context_line":"                # to support \u0027rolling upgrades\u0027, we\u0027ll accept pre-policy msg"},{"line_number":232,"context_line":"                # format and use policy index 0 (the legacy policy)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAVn%2F%2B%2Fyo%3D","line":229,"updated":"2014-03-10 20:00:13.000000000","message":"this code has the same problem as the old code (no upgrade path)","commit_id":"87b5df4eab0a3d5e832fd5f1a151260fbf842a83"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"5d75516cab9161b4f7bf88005e203db1b8c3fd0d","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                break"},{"line_number":227,"context_line":"            msg_parms \u003d [urllib.unquote(v) for v in line.split()]"},{"line_number":228,"context_line":"            if len(msg_parms) \u003d\u003d 3:"},{"line_number":229,"context_line":"                (object_hash, timestamp, policy_idx) \u003d msg_parms"},{"line_number":230,"context_line":"            else:"},{"line_number":231,"context_line":"                # to support \u0027rolling upgrades\u0027, we\u0027ll accept pre-policy msg"},{"line_number":232,"context_line":"                # format and use policy index 0 (the legacy policy)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAVn%2F%2B%2Fog%3D","line":229,"in_reply_to":"AAAAVn%2F%2B%2Fyo%3D","updated":"2014-03-10 20:15:14.000000000","message":"will take your suggestion on next update","commit_id":"87b5df4eab0a3d5e832fd5f1a151260fbf842a83"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"abbed260995e89b27a428c00c60fd903f9532e21","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                # to support \u0027rolling upgrades\u0027, we\u0027ll accept pre-policy msg"},{"line_number":232,"context_line":"                # format and use policy index 0 (the legacy policy)"},{"line_number":233,"context_line":"                (object_hash, timestamp) \u003d msg_parms"},{"line_number":234,"context_line":"                policy_idx \u003d 0"},{"line_number":235,"context_line":"            want \u003d False"},{"line_number":236,"context_line":"            try:"},{"line_number":237,"context_line":"                df \u003d self.app._diskfile_mgr.get_diskfile_from_hash("}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAVn%2F%2B%2Fyk%3D","line":234,"updated":"2014-03-10 20:00:13.000000000","message":"this code block is also executed if len(msg_params) \u003e 3 and blows up.","commit_id":"87b5df4eab0a3d5e832fd5f1a151260fbf842a83"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":5189,"name":"Yuan Zhou","email":"dunk007@gmail.com","username":"yuan-zhou"},"change_message_id":"f2227fef0a977b3db22baebe797953a5fae89890","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                \u0027%s:%s\u0027 % (self.node[\u0027ip\u0027], self.node[\u0027port\u0027]))"},{"line_number":94,"context_line":"            self.connection.putrequest(\u0027REPLICATION\u0027, \u0027/%s/%s\u0027 % ("},{"line_number":95,"context_line":"                self.node[\u0027device\u0027], self.job[\u0027partition\u0027]))"},{"line_number":96,"context_line":"            self.connection.putheader(\u0027Transfer-Encoding\u0027, \u0027chunked\u0027)"},{"line_number":97,"context_line":"            self.connection.endheaders()"},{"line_number":98,"context_line":"        with exceptions.MessageTimeout("},{"line_number":99,"context_line":"                self.daemon.node_timeout, \u0027connect receive\u0027):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FvCM%3D","line":96,"updated":"2014-01-09 02:09:34.000000000","message":"missing POLICY_INDEX header?","commit_id":"bed9cf69095fbe1ac34caaeb15e3065a2938c599"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"e93a8db20fb3494ad7556cbd3ed065472ca1b6ec","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                \u0027%s:%s\u0027 % (self.node[\u0027ip\u0027], self.node[\u0027port\u0027]))"},{"line_number":94,"context_line":"            self.connection.putrequest(\u0027REPLICATION\u0027, \u0027/%s/%s\u0027 % ("},{"line_number":95,"context_line":"                self.node[\u0027device\u0027], self.job[\u0027partition\u0027]))"},{"line_number":96,"context_line":"            self.connection.putheader(\u0027Transfer-Encoding\u0027, \u0027chunked\u0027)"},{"line_number":97,"context_line":"            self.connection.endheaders()"},{"line_number":98,"context_line":"        with exceptions.MessageTimeout("},{"line_number":99,"context_line":"                self.daemon.node_timeout, \u0027connect receive\u0027):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FrMo%3D","line":96,"in_reply_to":"AAAAUH%2F%2FvCM%3D","updated":"2014-01-09 18:41:36.000000000","message":"not in this case, the index isn\u0027t sent in the header.  for ssync its send in the body.for missing_check() and used by get_diskfile_from_hash in updates() on the sender side","commit_id":"bed9cf69095fbe1ac34caaeb15e3065a2938c599"},{"author":{"_account_id":5189,"name":"Yuan Zhou","email":"dunk007@gmail.com","username":"yuan-zhou"},"change_message_id":"117e85e2f27c0bcd945a84a617c08ab1b32c6885","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            except exceptions.DiskFileError:"},{"line_number":235,"context_line":"                pass"},{"line_number":236,"context_line":"            else:"},{"line_number":237,"context_line":"                self.send_put(url_path, df)"},{"line_number":238,"context_line":"        with exceptions.MessageTimeout("},{"line_number":239,"context_line":"                self.daemon.node_timeout, \u0027updates end\u0027):"},{"line_number":240,"context_line":"            msg \u003d \u0027:UPDATES: END\\r\\n\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2BaP0%3D","line":237,"updated":"2014-02-21 10:36:04.000000000","message":"should be self.send_put(url_path, df, self.jon[\u0027policy_idx\u0027])?","commit_id":"8dfdb7579420d0e89bfdeee69fe3d777119fd5b3"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"45521815c7823df87bc976dc91222658f1178491","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            except exceptions.DiskFileError:"},{"line_number":235,"context_line":"                pass"},{"line_number":236,"context_line":"            else:"},{"line_number":237,"context_line":"                self.send_put(url_path, df)"},{"line_number":238,"context_line":"        with exceptions.MessageTimeout("},{"line_number":239,"context_line":"                self.daemon.node_timeout, \u0027updates end\u0027):"},{"line_number":240,"context_line":"            msg \u003d \u0027:UPDATES: END\\r\\n\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2BYTo%3D","line":237,"in_reply_to":"AAAAUX%2F%2BaP0%3D","updated":"2014-02-21 14:30:19.000000000","message":"nice catch! Will have to make a change to test code as well, I had test_updates_put modified for policy support however because of how it mocks put this was missed.  I\u0027ll get that closed first and then fix this as well.  thanks","commit_id":"8dfdb7579420d0e89bfdeee69fe3d777119fd5b3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"ea20bc3d7a2390736fbcb3ce657a50987ae485e5","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    self.daemon.node_timeout,"},{"line_number":171,"context_line":"                    \u0027missing_check send line\u0027):"},{"line_number":172,"context_line":"                if len(POLICIES) \u003d\u003d 1:"},{"line_number":173,"context_line":"                    msg \u003d \u0027%s %s \\r\\n\u0027 % ("},{"line_number":174,"context_line":"                        urllib.quote(object_hash),"},{"line_number":175,"context_line":"                        urllib.quote(timestamp))"},{"line_number":176,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAVn%2F%2FAHE%3D","line":173,"updated":"2014-03-10 19:19:31.000000000","message":"Looks like the trailing space here is compatible with existing ssync. Not sure why it\u0027s even necessary, however.","commit_id":"87b5df4eab0a3d5e832fd5f1a151260fbf842a83"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"5d75516cab9161b4f7bf88005e203db1b8c3fd0d","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    self.daemon.node_timeout,"},{"line_number":171,"context_line":"                    \u0027missing_check send line\u0027):"},{"line_number":172,"context_line":"                if len(POLICIES) \u003d\u003d 1:"},{"line_number":173,"context_line":"                    msg \u003d \u0027%s %s \\r\\n\u0027 % ("},{"line_number":174,"context_line":"                        urllib.quote(object_hash),"},{"line_number":175,"context_line":"                        urllib.quote(timestamp))"},{"line_number":176,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAVn%2F%2B%2FpA%3D","line":173,"in_reply_to":"AAAAVn%2F%2FAHE%3D","updated":"2014-03-10 20:15:14.000000000","message":"typo","commit_id":"87b5df4eab0a3d5e832fd5f1a151260fbf842a83"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d357290bfcee1ec46dad2da900e6673d4959d9d0","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                    msg \u003d \u0027%s %s\\r\\n\u0027 % ("},{"line_number":179,"context_line":"                        urllib.quote(object_hash),"},{"line_number":180,"context_line":"                        urllib.quote(timestamp))"},{"line_number":181,"context_line":"                    self.connection.send(\u0027%x\\r\\n%s\\r\\n\u0027 % (len(msg), msg))"},{"line_number":182,"context_line":"        with exceptions.MessageTimeout("},{"line_number":183,"context_line":"                self.daemon.node_timeout, \u0027missing_check end\u0027):"},{"line_number":184,"context_line":"            msg \u003d \u0027:MISSING_CHECK: END\\r\\n\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVn%2F%2B2qY%3D","line":181,"updated":"2014-03-11 18:15:16.000000000","message":"over indent?","commit_id":"eda3531f56a751c4ec1995662fd2f6942e6a72da"}],"test/unit/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d357290bfcee1ec46dad2da900e6673d4959d9d0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        policies \u003d policies or ["},{"line_number":62,"context_line":"            storage_policy.StoragePolicy(0, \u0027\u0027, True),"},{"line_number":63,"context_line":"            storage_policy.StoragePolicy(1, \u0027\u0027),"},{"line_number":64,"context_line":"        ]"},{"line_number":65,"context_line":"        if isinstance(policies, storage_policy.StoragePolicyCollection):"},{"line_number":66,"context_line":"            self.policies \u003d policies"},{"line_number":67,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVn%2F%2B2pI%3D","line":64,"updated":"2014-03-11 18:15:16.000000000","message":"this was vestigial, it\u0027s not needed anymore since the primary interface (function patch_policies) will always send a non-None value for policies.  Might not hurt to have it here, but creates some duplication for the \"default\" patched policies value.\n\nI think we should either remove it here, or create a shared global DEFAULT_PATCH_POLICIES that both interfaces share.","commit_id":"eda3531f56a751c4ec1995662fd2f6942e6a72da"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"6943cff5239188ea26733e2d4bf05f3f3fdf50f0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        policies \u003d policies or ["},{"line_number":62,"context_line":"            storage_policy.StoragePolicy(0, \u0027\u0027, True),"},{"line_number":63,"context_line":"            storage_policy.StoragePolicy(1, \u0027\u0027),"},{"line_number":64,"context_line":"        ]"},{"line_number":65,"context_line":"        if isinstance(policies, storage_policy.StoragePolicyCollection):"},{"line_number":66,"context_line":"            self.policies \u003d policies"},{"line_number":67,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVn%2F%2B2g4%3D","line":64,"in_reply_to":"AAAAVn%2F%2B2pI%3D","updated":"2014-03-11 18:27:13.000000000","message":"you mean like this:\n.....\n    patched yet)\n    \"\"\"\n\n    def __init__(self, policies):\n        self.policies \u003d policies\n    \n    def __call__(self, thing):\n......","commit_id":"eda3531f56a751c4ec1995662fd2f6942e6a72da"}],"test/unit/obj/test_ssync_receiver.py":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"aa21d3425a832aec173c96eab12303043e6f757d","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        self.assertFalse(self.controller.logger.exception.called)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def test_MISSING_CHECK_have_one_exact(self):"},{"line_number":463,"context_line":"        for pol in POLICIES:"},{"line_number":464,"context_line":"            object_dir \u003d utils.storage_directory("},{"line_number":465,"context_line":"                os.path.join(self.testdir, \u0027sda1\u0027,"},{"line_number":466,"context_line":"                             diskfile.get_data_dir(pol.idx)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2Fw1E%3D","line":463,"updated":"2014-03-04 08:27:25.000000000","message":"I know that swift.common.storage_policy.POLICIES ensures that there is at least a default policy, but maybe just add a line\n\n self.assertTrue(len(POLICIES) \u003e 0))\n\nCould be even in setUp.\n\nJust to ensure that tests are really run and not somehow silently skipped due to a refactoring in swift.common.storage_policy.\n\nSame applies to other tests below (if not done in setUp) and to test_ssync_sender.py","commit_id":"81cffe2bd20dd8fa6d39b99625f798421cbd987c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"7c978329cdd0c0f138c1a6c55fdf379aafaa72cc","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        self.assertFalse(self.controller.logger.exception.called)"},{"line_number":461,"context_line":""},{"line_number":462,"context_line":"    def test_MISSING_CHECK_have_one_exact(self):"},{"line_number":463,"context_line":"        for pol in POLICIES:"},{"line_number":464,"context_line":"            object_dir \u003d utils.storage_directory("},{"line_number":465,"context_line":"                os.path.join(self.testdir, \u0027sda1\u0027,"},{"line_number":466,"context_line":"                             diskfile.get_data_dir(pol.idx)),"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FrsU%3D","line":463,"in_reply_to":"AAAAVn%2F%2Fw1E%3D","updated":"2014-03-04 17:45:39.000000000","message":"Thanks! I do already have this covered in test_defaults() in test_storage_policies.py so I think we\u0027re good.","commit_id":"81cffe2bd20dd8fa6d39b99625f798421cbd987c"}],"test/unit/obj/test_ssync_sender.py":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"aa21d3425a832aec173c96eab12303043e6f757d","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    # Policy support here is tested w/o needing access to the POLICIES"},{"line_number":359,"context_line":"    # singleton as the policy index is embedded in communication between"},{"line_number":360,"context_line":"    # the sender and receiver after policies are enumberated in the"},{"line_number":361,"context_line":"    # replcaitor.  So here we use an arbitrary value of 6 specified in"},{"line_number":362,"context_line":"    # the job and make sure what missing_check() sends includes the idx"},{"line_number":363,"context_line":"    def test_missing_check_has_suffixes(self):"},{"line_number":364,"context_line":"        def yield_hashes(device, partition, policy_idx, suffixes\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FxPA%3D","line":361,"updated":"2014-03-04 08:27:25.000000000","message":"Nitpicking... \n\nreplcaitor -\u003e replicator","commit_id":"81cffe2bd20dd8fa6d39b99625f798421cbd987c"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"7c978329cdd0c0f138c1a6c55fdf379aafaa72cc","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    # Policy support here is tested w/o needing access to the POLICIES"},{"line_number":359,"context_line":"    # singleton as the policy index is embedded in communication between"},{"line_number":360,"context_line":"    # the sender and receiver after policies are enumberated in the"},{"line_number":361,"context_line":"    # replcaitor.  So here we use an arbitrary value of 6 specified in"},{"line_number":362,"context_line":"    # the job and make sure what missing_check() sends includes the idx"},{"line_number":363,"context_line":"    def test_missing_check_has_suffixes(self):"},{"line_number":364,"context_line":"        def yield_hashes(device, partition, policy_idx, suffixes\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2Frrk%3D","line":361,"in_reply_to":"AAAAVn%2F%2FxPA%3D","updated":"2014-03-04 17:45:39.000000000","message":"argh, thanks Christian :)","commit_id":"81cffe2bd20dd8fa6d39b99625f798421cbd987c"}]}
