)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"de0a6812d250aabbb191d0cb0890669bcd22b508","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bardia Keyoumarsi \u003cbardia.keyoumarsi@cohodata.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-05-18 17:02:05 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Coho Data: Reconnet to cluster on broken pipe"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Handle broken pipe errors and retry connection to cluster"},{"line_number":10,"context_line":"before reporting error on the operation."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bab6814e_3ed75cee","line":7,"range":{"start_line":7,"start_character":11,"end_line":7,"end_character":19},"updated":"2016-05-20 13:21:19.000000000","message":"/Reconnet/Reconnect/","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"}],"cinder/tests/unit/test_coho.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"3d56b49b28e8e92a5fbd38adcacc72a23d53e2cb","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                                    \"Failed to establish.*\"):"},{"line_number":390,"context_line":"            rpc_client.create_snapshot(\u0027src\u0027, \u0027dest\u0027, 0)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        self.assertTrue(mock_make_call.call_count \u003d\u003d coho.COHO_MAX_RETRIES)"},{"line_number":393,"context_line":"        self.assertTrue(mock_socket.call_count \u003d\u003d coho.COHO_MAX_RETRIES + 1)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        # assert that on a none EPIPE error it only tries once"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_9fd151d0","line":392,"updated":"2016-05-25 15:22:46.000000000","message":"Use self.assertEqual()","commit_id":"f7bdfaa16428de0964fed17966c119d50d071773"},{"author":{"_account_id":18448,"name":"Bardia Keyoumarsi","email":"bardia.keyoumarsi@cohodata.com","username":"bkeyoumarsi"},"change_message_id":"84c5724256701a10c34c9f7468778eb0bcbd7eaa","unresolved":false,"context_lines":[{"line_number":389,"context_line":"                                    \"Failed to establish.*\"):"},{"line_number":390,"context_line":"            rpc_client.create_snapshot(\u0027src\u0027, \u0027dest\u0027, 0)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        self.assertTrue(mock_make_call.call_count \u003d\u003d coho.COHO_MAX_RETRIES)"},{"line_number":393,"context_line":"        self.assertTrue(mock_socket.call_count \u003d\u003d coho.COHO_MAX_RETRIES + 1)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        # assert that on a none EPIPE error it only tries once"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_137715a0","line":392,"in_reply_to":"bab6814e_9fd151d0","updated":"2016-05-25 16:52:41.000000000","message":"Done","commit_id":"f7bdfaa16428de0964fed17966c119d50d071773"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"3d56b49b28e8e92a5fbd38adcacc72a23d53e2cb","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            rpc_client.create_snapshot(\u0027src\u0027, \u0027dest\u0027, 0)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        self.assertTrue(mock_make_call.call_count \u003d\u003d coho.COHO_MAX_RETRIES)"},{"line_number":393,"context_line":"        self.assertTrue(mock_socket.call_count \u003d\u003d coho.COHO_MAX_RETRIES + 1)"},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"        # assert that on a none EPIPE error it only tries once"},{"line_number":396,"context_line":"        socket_error.errno \u003d errno.EINVAL"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_7fd46dbc","line":393,"updated":"2016-05-25 15:22:46.000000000","message":"Ditto","commit_id":"f7bdfaa16428de0964fed17966c119d50d071773"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"3d56b49b28e8e92a5fbd38adcacc72a23d53e2cb","unresolved":false,"context_lines":[{"line_number":399,"context_line":"                                    \"Unable to send request.*\"):"},{"line_number":400,"context_line":"            rpc_client.delete_snapshot(\u0027src\u0027)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        self.assertTrue(mock_make_call.call_count \u003d\u003d coho.COHO_MAX_RETRIES + 1)"},{"line_number":403,"context_line":"        self.assertTrue(mock_socket.call_count \u003d\u003d coho.COHO_MAX_RETRIES + 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_dfdbd9eb","line":402,"updated":"2016-05-25 15:22:46.000000000","message":"Ditto","commit_id":"f7bdfaa16428de0964fed17966c119d50d071773"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"3d56b49b28e8e92a5fbd38adcacc72a23d53e2cb","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            rpc_client.delete_snapshot(\u0027src\u0027)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        self.assertTrue(mock_make_call.call_count \u003d\u003d coho.COHO_MAX_RETRIES + 1)"},{"line_number":403,"context_line":"        self.assertTrue(mock_socket.call_count \u003d\u003d coho.COHO_MAX_RETRIES + 1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_1fe601b4","line":403,"updated":"2016-05-25 15:22:46.000000000","message":"Ditto","commit_id":"f7bdfaa16428de0964fed17966c119d50d071773"}],"cinder/volume/drivers/coho.py":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"7251d6ce796341bbac37c447a7d8d37e1feeaf6a","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.packer \u003d xdrlib.Packer()"},{"line_number":76,"context_line":"        self.unpacker \u003d xdrlib.Unpacker(\u0027\u0027)"},{"line_number":77,"context_line":"        self.address \u003d address"},{"line_number":78,"context_line":"        self.lock \u003d threading.Lock()"},{"line_number":79,"context_line":"        self.prog \u003d prog"},{"line_number":80,"context_line":"        self.vers \u003d vers"},{"line_number":81,"context_line":"        self.port \u003d port"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_1c7a0424","line":78,"updated":"2016-05-23 18:14:31.000000000","message":"why?  You never use the lock to block anything.  You never acquire the lock, nor do you release it.","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"2cdceb656f6547ecfd9782e317daec1a5b88d0dd","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        with self.lock:"},{"line_number":236,"context_line":"            for retry in range(COHO_MAX_RETRIES):"},{"line_number":237,"context_line":"                try:"},{"line_number":238,"context_line":"                    self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_7c8fd074","line":235,"updated":"2016-05-23 18:10:56.000000000","message":"please, use retry decorator [1]\n\n\n[1] https://github.com/openstack/cinder/blob/master/cinder/utils.py#L753","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"7251d6ce796341bbac37c447a7d8d37e1feeaf6a","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        with self.lock:"},{"line_number":236,"context_line":"            for retry in range(COHO_MAX_RETRIES):"},{"line_number":237,"context_line":"                try:"},{"line_number":238,"context_line":"                    self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_9c943437","line":235,"updated":"2016-05-23 18:14:31.000000000","message":"this is just a Lock object.  You aren\u0027t actually acquiring a lock that can block here, so I\u0027m not sure what the point of this is.","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":18448,"name":"Bardia Keyoumarsi","email":"bardia.keyoumarsi@cohodata.com","username":"bkeyoumarsi"},"change_message_id":"ca442911d99eb232f5be2274d7ce4ded71302239","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        with self.lock:"},{"line_number":236,"context_line":"            for retry in range(COHO_MAX_RETRIES):"},{"line_number":237,"context_line":"                try:"},{"line_number":238,"context_line":"                    self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_92941b37","line":235,"in_reply_to":"bab6814e_5748e5b2","updated":"2016-05-23 18:50:54.000000000","message":"Sean beat me to it.","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":18448,"name":"Bardia Keyoumarsi","email":"bardia.keyoumarsi@cohodata.com","username":"bkeyoumarsi"},"change_message_id":"ca442911d99eb232f5be2274d7ce4ded71302239","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        with self.lock:"},{"line_number":236,"context_line":"            for retry in range(COHO_MAX_RETRIES):"},{"line_number":237,"context_line":"                try:"},{"line_number":238,"context_line":"                    self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_d2b183e1","line":235,"in_reply_to":"bab6814e_7c8fd074","updated":"2016-05-23 18:50:54.000000000","message":"Thanks Ivan for the pointer but as Sean mentions below I would like the lock to be held while the retries happen so leaving the retry loop as is. Will keep the @retry decorator in mind for future needs.","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4ed0be6c34a14b1936463680267868a2e6405d0c","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        with self.lock:"},{"line_number":236,"context_line":"            for retry in range(COHO_MAX_RETRIES):"},{"line_number":237,"context_line":"                try:"},{"line_number":238,"context_line":"                    self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_5748e5b2","line":235,"in_reply_to":"bab6814e_9c943437","updated":"2016-05-23 18:34:16.000000000","message":"Actually, using the lock as a context manager does acquire the lock. So this usage looks correct.\n\nhttps://docs.python.org/2/library/threading.html#using-locks-conditions-and-semaphores-in-the-with-statement\n\nNot sure if the retry decorator would work well here if you want the lock held while the retries happen. Otherwise the lock would be released and reacquired each time, allowing something else to come in in the small window in between.","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f572d1addcd1215fa05b464b9c7984931d79e77c","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        with self.lock:"},{"line_number":236,"context_line":"            for retry in range(COHO_MAX_RETRIES):"},{"line_number":237,"context_line":"                try:"},{"line_number":238,"context_line":"                    self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_eb5f3573","line":235,"in_reply_to":"bab6814e_d2b183e1","updated":"2016-05-24 20:21:04.000000000","message":"Rather than creating self.lock, you should decorate this method with @utils.synchronized().\n\nThis will let you keep the same semantics but share the locking code used by other drivers.","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":18448,"name":"Bardia Keyoumarsi","email":"bardia.keyoumarsi@cohodata.com","username":"bkeyoumarsi"},"change_message_id":"5ff1befd629f5a371f40646369696e145a337d46","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        with self.lock:"},{"line_number":236,"context_line":"            for retry in range(COHO_MAX_RETRIES):"},{"line_number":237,"context_line":"                try:"},{"line_number":238,"context_line":"                    self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_fcb9b9ed","line":235,"in_reply_to":"bab6814e_eb5f3573","updated":"2016-05-24 21:35:47.000000000","message":"Done","commit_id":"f49d2ba234f52bc8206a229be167b28a0f2f999f"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"3d56b49b28e8e92a5fbd38adcacc72a23d53e2cb","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        self.unpacker.reset(reply)"},{"line_number":231,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    @utils.synchronized(\u0027coho-rpc-\u0027, external\u003dTrue)"},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        for retry in range(COHO_MAX_RETRIES):"},{"line_number":236,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_dfb0f98d","line":233,"updated":"2016-05-25 15:22:46.000000000","message":"Should remove the second dash in the lock name, just to be consistent with other locks and not confusing for someone debugging things.","commit_id":"f7bdfaa16428de0964fed17966c119d50d071773"},{"author":{"_account_id":18448,"name":"Bardia Keyoumarsi","email":"bardia.keyoumarsi@cohodata.com","username":"bkeyoumarsi"},"change_message_id":"84c5724256701a10c34c9f7468778eb0bcbd7eaa","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        self.unpacker.reset(reply)"},{"line_number":231,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    @utils.synchronized(\u0027coho-rpc-\u0027, external\u003dTrue)"},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        for retry in range(COHO_MAX_RETRIES):"},{"line_number":236,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bab6814e_20bf6161","line":233,"in_reply_to":"bab6814e_dfb0f98d","updated":"2016-05-25 16:52:41.000000000","message":"Done","commit_id":"f7bdfaa16428de0964fed17966c119d50d071773"},{"author":{"_account_id":10628,"name":"Peter Wang","email":"peter.wang13@emc.com","username":"peter_wang"},"change_message_id":"13218ee323919172392dcad7064816581a8beb8d","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        xid, verf \u003d self.unpack_replyheader()"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    @utils.synchronized(\u0027coho-rpc\u0027, external\u003dTrue)"},{"line_number":234,"context_line":"    def _call(self, proc, args):"},{"line_number":235,"context_line":"        for retry in range(COHO_MAX_RETRIES):"},{"line_number":236,"context_line":"            try:"},{"line_number":237,"context_line":"                self._make_call(proc, args)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_d1dda515","line":234,"updated":"2016-05-30 14:18:31.000000000","message":"You could consider using the `retry` decorator under cinder/utils.","commit_id":"ec0d8da874b9250226ddf830b7e5e1e2b24bae34"}]}
