)]}'
{"oslo_db/api.py":[{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"520e3f77205c0ffea106ff91ddbc33b7c11a0f0b","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            return True"},{"line_number":176,"context_line":"        return self.exception_checker(exc)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _get_inc_interval(self, n):"},{"line_number":179,"context_line":"        n \u003d n * 2"},{"line_number":180,"context_line":"        # using exponential backoff"},{"line_number":181,"context_line":"        if self.exp_backoff:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_01582bf7","line":178,"updated":"2017-12-12 19:41:52.000000000","message":"If im reading this correctly, the backoff without exp_backoff looks like:\n\n1\n2\n4\n8\n16\n32\n... etc\n\nthen *with* the backoff, it looks like:\n\n1\n0-1\n0-4\n0-8\n0-16\n0-32\n\ne.g. we could see the backoff occurring at something like \"2, 3, 5, 2, 1\".    This doesn\u0027t look exactly like \"jitter\" to me.\n\nIf I wanted \"jitter\", I\u0027d want to localize the randomness to just the top edge of the timing, say if it were in the top 25% I\u0027d want the backoff to look like:\n\n1\n1.5 - 2.0\n3.0 - 4.0\n6.0 - 8.0\n12.0 - 16.0\n24.0 - 32.0\n\nthis would make the backoff calc like:\n\nn -\u003d  random.random() * (n/4)\n\nI tried out a quick demo and got something like that:\n\n\u003e\u003e\u003e import random\n\u003e\u003e\u003e n \u003d 1\n\u003e\u003e\u003e for i in range(8):\n...     p \u003d n * 2\n...     p -\u003d random.random() * (p / 4)\n...     print \"n: %s p: %s\" % (n, p)\n...     n \u003d p\n... \nn: 1 p: 2.0\nn: 2.0 p: 3.86231708496\nn: 3.86231708496 p: 6.14978715622\nn: 6.14978715622 p: 10.335695016\nn: 10.335695016 p: 16.4952458939\nn: 16.4952458939 p: 32.1308787803\nn: 32.1308787803 p: 53.9408607529\nn: 53.9408607529 p: 96.7869637103\n\u003e\u003e\u003e \n\n\nneeds a little refinement but what do you think?","commit_id":"ae6789b61dd184c93975e63c43d0b8996174a80c"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"98d97017abd5dcb62f104b43f361d7f4582457fb","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            return True"},{"line_number":176,"context_line":"        return self.exception_checker(exc)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _get_inc_interval(self, n):"},{"line_number":179,"context_line":"        n \u003d n * 2"},{"line_number":180,"context_line":"        # using exponential backoff"},{"line_number":181,"context_line":"        if self.exp_backoff:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df87a7cf_3639eef1","line":178,"in_reply_to":"df87a7cf_01582bf7","updated":"2017-12-13 03:34:00.000000000","message":"@Micheal, Thanks for you patient review and great demo. : ) \n\nYes, your understanding of my patch is right, The sleep time of each retry is [0, (2 ** retry_time) - 1] sec. \nThe jitter you wanted, the base min value is closing to 2**n (the range is [2**n * 75%, 2**n], so, the average waiting time is more than mine, but it\u0027s hard to say mine is better.\n\n\nAnd I find a blog from AWS:\n\nhttps://amazonaws-china.com/blogs/architecture/exponential-backoff-and-jitter/\n\nThe FullJitter(mine) and the EqualJitter(yours, top 50% backoff) in blog is very similar with our stuff. Obviously, the EqualJitter bring us the more secure retry, the expense is we need more sleep time rather than the FullJitter stuff.\n\n\nThe question is: \nDo we need this big base(that is to say, a longer sleep of each retry) and also need a longer timing window, or we ONLY need a longer timing window?\n\nIn the case of deadlock, I think a longer timing window is enough, just for avoiding the re-call at same time again. But it seems, in other cases, perhaps a longer sleep is better, maybe you\u0027re right when we consider the common situation. \n\n\nBTW, unrelated to the jitter, it\u0027s the inspire from your demo, I really think random float x is better rather than random int x, because float one has a greater range.\n\n\nOK, That\u0027s all my opinions. If any other idea you have after see my rely and the ref blog, you could feel free to reply. \n\nThanks and regards. : )","commit_id":"ae6789b61dd184c93975e63c43d0b8996174a80c"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"1ce7f3ee87a3071e961dcaf9041df97744be79b9","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                 max_retry_interval\u003d10, retry_on_disconnect\u003dFalse,"},{"line_number":112,"context_line":"                 retry_on_deadlock\u003dFalse,"},{"line_number":113,"context_line":"                 exception_checker\u003dlambda exc: False,"},{"line_number":114,"context_line":"                 exp_backoff\u003dFalse):"},{"line_number":115,"context_line":"        super(wrap_db_retry, self).__init__()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        self.exp_backoff \u003d exp_backoff"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_7cd51543","line":114,"range":{"start_line":114,"start_character":17,"end_line":114,"end_character":28},"updated":"2018-03-16 20:51:43.000000000","message":"We need to add this parameter to the docstring above.","commit_id":"618de6e60b1fbd3d1d16444d8a048c9677e57b12"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ecde34b58a70488c7e19288a61092f465cc8092d","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                 max_retry_interval\u003d10, retry_on_disconnect\u003dFalse,"},{"line_number":112,"context_line":"                 retry_on_deadlock\u003dFalse,"},{"line_number":113,"context_line":"                 exception_checker\u003dlambda exc: False,"},{"line_number":114,"context_line":"                 exp_backoff\u003dFalse):"},{"line_number":115,"context_line":"        super(wrap_db_retry, self).__init__()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        self.exp_backoff \u003d exp_backoff"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_c3a14e96","line":114,"range":{"start_line":114,"start_character":17,"end_line":114,"end_character":28},"in_reply_to":"df7087c5_7cd51543","updated":"2018-03-29 11:11:19.000000000","message":"Done","commit_id":"618de6e60b1fbd3d1d16444d8a048c9677e57b12"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"1ce7f3ee87a3071e961dcaf9041df97744be79b9","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            # regenerating a deadlock and reduce the average sleep time, we"},{"line_number":126,"context_line":"            # are using exponential backoff by default when the deadlock is"},{"line_number":127,"context_line":"            # detected."},{"line_number":128,"context_line":"            self.exp_backoff \u003d True"},{"line_number":129,"context_line":"            self.db_error +\u003d (exception.DBDeadlock, )"},{"line_number":130,"context_line":"        self.retry_interval \u003d retry_interval"},{"line_number":131,"context_line":"        self.max_retries \u003d max_retries"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_bcebadda","line":128,"updated":"2018-03-16 20:51:43.000000000","message":"I\u0027m not sure this is the appropriate place for this logic.  It would result in exp_backoff being used for _all_ errors, whether they are deadlocks or not.  If we want to force exp_backoff for deadlocks I think we need logic where the exception is caught to determine whether to use exp_backoff.","commit_id":"618de6e60b1fbd3d1d16444d8a048c9677e57b12"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ecde34b58a70488c7e19288a61092f465cc8092d","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            # regenerating a deadlock and reduce the average sleep time, we"},{"line_number":126,"context_line":"            # are using exponential backoff by default when the deadlock is"},{"line_number":127,"context_line":"            # detected."},{"line_number":128,"context_line":"            self.exp_backoff \u003d True"},{"line_number":129,"context_line":"            self.db_error +\u003d (exception.DBDeadlock, )"},{"line_number":130,"context_line":"        self.retry_interval \u003d retry_interval"},{"line_number":131,"context_line":"        self.max_retries \u003d max_retries"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_43bf7eaf","line":128,"in_reply_to":"df7087c5_bcebadda","updated":"2018-03-29 11:11:19.000000000","message":"Yeah, good point, I have updated.","commit_id":"618de6e60b1fbd3d1d16444d8a048c9677e57b12"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"500731aea2969893b9cc25ce55df4163b8d2dd60","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            # regenerating a deadlock and reduce the average sleep time, we"},{"line_number":126,"context_line":"            # are using exponential backoff by default when the deadlock is"},{"line_number":127,"context_line":"            # detected."},{"line_number":128,"context_line":"            self.exp_backoff \u003d True"},{"line_number":129,"context_line":"            self.db_error +\u003d (exception.DBDeadlock, )"},{"line_number":130,"context_line":"        self.retry_interval \u003d retry_interval"},{"line_number":131,"context_line":"        self.max_retries \u003d max_retries"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_3d15d7e5","line":128,"in_reply_to":"df7087c5_bcebadda","updated":"2018-03-22 14:24:11.000000000","message":"good call","commit_id":"618de6e60b1fbd3d1d16444d8a048c9677e57b12"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"74b5f1b69bd671eccdf91d54cfef42d9ecbcfa64","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    #                  this effectively yields the execution"},{"line_number":159,"context_line":"                    #                  context to another green thread."},{"line_number":160,"context_line":"                    time.sleep(next_interval)"},{"line_number":161,"context_line":"                    if self.inc_retry_interval:"},{"line_number":162,"context_line":"                        next_interval \u003d self._get_inc_interval(next_interval)"},{"line_number":163,"context_line":"                    remaining -\u003d 1"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_29716fe1","line":161,"updated":"2018-04-06 17:47:45.000000000","message":"I think this is where we need to be checking for deadlocks and forcing exp_backoff, but we need to not set it on the member variable.  As I proposed below, I suggest adding an exp_backoff parameter to _get_inc_interval and then adding logic here to set it appropriately.  It would look something like:\n\nexp_backoff \u003d self.exp_backoff\nif isinstance(e, exception.DBDeadlock):\n   exp_backoff \u003d True\nnext_interval \u003d self._get_inc_interval(next_interval, exp_backoff)\n\nThat way it will be set per-exception and not per decorator.","commit_id":"70d66fbcda1e2c983e9ba785d7f2707db2b559b7"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f2b5ef9c9f4cac0b82ca6121133959386d7360ae","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                    #                  this effectively yields the execution"},{"line_number":159,"context_line":"                    #                  context to another green thread."},{"line_number":160,"context_line":"                    time.sleep(next_interval)"},{"line_number":161,"context_line":"                    if self.inc_retry_interval:"},{"line_number":162,"context_line":"                        next_interval \u003d self._get_inc_interval(next_interval)"},{"line_number":163,"context_line":"                    remaining -\u003d 1"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_670d3934","line":161,"in_reply_to":"bf659307_29716fe1","updated":"2018-04-09 04:16:43.000000000","message":"Done","commit_id":"70d66fbcda1e2c983e9ba785d7f2707db2b559b7"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"74b5f1b69bd671eccdf91d54cfef42d9ecbcfa64","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            # regenerating a deadlock and reduce the average sleep time, we"},{"line_number":176,"context_line":"            # are using exponential backoff by default when the deadlock is"},{"line_number":177,"context_line":"            # detected."},{"line_number":178,"context_line":"            self.exp_backoff \u003d isinstance(exc, exception.DBDeadlock)"},{"line_number":179,"context_line":"            return True"},{"line_number":180,"context_line":"        return self.exception_checker(exc)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_09d02bc9","line":178,"updated":"2018-04-06 17:47:45.000000000","message":"This is still setting exp_backoff in a permanent way, which means if we have a deadlock then all subsequent retries will be using exp_backoff, regardless of what the user specified.","commit_id":"70d66fbcda1e2c983e9ba785d7f2707db2b559b7"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f2b5ef9c9f4cac0b82ca6121133959386d7360ae","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            # regenerating a deadlock and reduce the average sleep time, we"},{"line_number":176,"context_line":"            # are using exponential backoff by default when the deadlock is"},{"line_number":177,"context_line":"            # detected."},{"line_number":178,"context_line":"            self.exp_backoff \u003d isinstance(exc, exception.DBDeadlock)"},{"line_number":179,"context_line":"            return True"},{"line_number":180,"context_line":"        return self.exception_checker(exc)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_87216da2","line":178,"in_reply_to":"bf659307_09d02bc9","updated":"2018-04-09 04:16:43.000000000","message":"Yeah, sorry to miss it.","commit_id":"70d66fbcda1e2c983e9ba785d7f2707db2b559b7"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"74b5f1b69bd671eccdf91d54cfef42d9ecbcfa64","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    def _get_inc_interval(self, n):"},{"line_number":183,"context_line":"        n \u003d n * 2"},{"line_number":184,"context_line":"        # using exponential backoff"},{"line_number":185,"context_line":"        if self.exp_backoff:"},{"line_number":186,"context_line":"            n \u003d random.uniform(0, n - 1)"},{"line_number":187,"context_line":"        return min(n, self.max_retry_interval)"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_29ee4f88","line":185,"updated":"2018-04-06 17:47:45.000000000","message":"Instead of using the member variable here, I think we need it to be a parameter to this function.  So this would then have (self, n, exp_backoff) and we\u0027d pass in exp_backoff from above.","commit_id":"70d66fbcda1e2c983e9ba785d7f2707db2b559b7"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"f2b5ef9c9f4cac0b82ca6121133959386d7360ae","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    def _get_inc_interval(self, n):"},{"line_number":183,"context_line":"        n \u003d n * 2"},{"line_number":184,"context_line":"        # using exponential backoff"},{"line_number":185,"context_line":"        if self.exp_backoff:"},{"line_number":186,"context_line":"            n \u003d random.uniform(0, n - 1)"},{"line_number":187,"context_line":"        return min(n, self.max_retry_interval)"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_2730a1e8","line":185,"in_reply_to":"bf659307_29ee4f88","updated":"2018-04-09 04:16:43.000000000","message":"Done","commit_id":"70d66fbcda1e2c983e9ba785d7f2707db2b559b7"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"2bf94dff6bdea878ff001e3bca353ea729eaeb96","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        n \u003d n * 2"},{"line_number":187,"context_line":"        # using exponential backoff"},{"line_number":188,"context_line":"        if exp_backoff:"},{"line_number":189,"context_line":"            n \u003d random.uniform(0, n - 1)"},{"line_number":190,"context_line":"        return min(n, self.max_retry_interval)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_837db21d","line":189,"updated":"2018-04-10 16:05:07.000000000","message":"I think we need to start the random range at 1 instead of 0.  Previously it wasn\u0027t an issue, but by introducing the random element it is possible for n to be \u003c 1, in which case we\u0027d be randomizing from 0 to a negative number.  It looks like passing a negative number to time.sleep results in an error, so we don\u0027t want to do that.\n\nFor example consider this case:\n\nOn our first call, n is 1.  We multiply it by 2, so now we randomize from 0 to 2.  Let\u0027s say random.uniform returns .3.  For this loop that\u0027s fine.  But if an error happens again and we have to do another retry, this time _get_inc_interval is called with an n of .3.  .3 * 2 \u003d .6.  This would result in a random call of 0 to -.4, which will not work.\n\nAs long as we never return a value of \u003c 1 that scenario can\u0027t happen, so I think making 1 the lower bound of the random range is the way to go.  It narrows the jitter range somewhat, but I wouldn\u0027t expect it to be a problem.","commit_id":"31d9b2f618ffc37da0e64040f8f995af776e65dc"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ed4b95da77779479f7c404b79b2d45415f216710","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        n \u003d n * 2"},{"line_number":187,"context_line":"        # using exponential backoff"},{"line_number":188,"context_line":"        if exp_backoff:"},{"line_number":189,"context_line":"            n \u003d random.uniform(0, n - 1)"},{"line_number":190,"context_line":"        return min(n, self.max_retry_interval)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_97587e8a","line":189,"in_reply_to":"bf659307_837db21d","updated":"2018-04-11 03:06:18.000000000","message":"Wow, I made a mistake in here. Thanks for your patient review. Yes, if we want to keep this, we definitely can change 0 to 1. : )\n\nBut after deep consideration, I want to introduce a new var , sleep_time, in here to record the real sleep time, and next_interval just a base interval.\n- Without jitter: sleep_time \u003d 2 ** retry_times \u003d next_interval\n- With jitter:    sleep_time \u003d [0, 2 ** retry_times) \u003c next_interval\n\nAnd the sleep time like:\n1st call, sleep_time 1\n2nd call, sleep_time [0, 2)\n3rd call, sleep_time [0, 4)\n4rd call, sleep_time [0, 8)\n...\n\nand the case like ONLY 2nd call raise a deadlock without user specific jitter enable:\n1st call, sleep_time 1\n2nd call, sleep_time [0, 2)  # \u003c\u003d detected the deadlock, exp backoff with jitter\n3rd call, sleep_time 4       # \u003c\u003d back to exp backoff\n4rd call, sleep_time 8\n...","commit_id":"31d9b2f618ffc37da0e64040f8f995af776e65dc"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"0ffbf8b8158b117ed39c1ee64f4078002b7eb820","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        n \u003d n * 2"},{"line_number":187,"context_line":"        # using exponential backoff"},{"line_number":188,"context_line":"        if exp_backoff:"},{"line_number":189,"context_line":"            n \u003d random.uniform(0, n - 1)"},{"line_number":190,"context_line":"        return min(n, self.max_retry_interval)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bf659307_c2b396e8","line":189,"in_reply_to":"bf659307_97587e8a","updated":"2018-04-11 03:35:16.000000000","message":"See https://review.openstack.org/#/c/527362/7","commit_id":"31d9b2f618ffc37da0e64040f8f995af776e65dc"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"0c62b0f9defed0709667c9e724838e8fd893189c","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    :param exception_checker: checks if an exception should trigger a retry"},{"line_number":106,"context_line":"    :type exception_checker: callable"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    :param jitter: determine increase retry interval use jitter or not"},{"line_number":109,"context_line":"    :type jitter: bool"},{"line_number":110,"context_line":"    \"\"\""},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_40250d08","line":108,"updated":"2018-04-12 15:25:37.000000000","message":"\"jitter is always interpreted as True for a DBDeadlockError\"","commit_id":"46bfd3c812fe4c5fdc3d64d9a21fbc6e53078de2"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"618c9adb03ea98fa1d9a3ad847b8aebf3a51b571","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    :param exception_checker: checks if an exception should trigger a retry"},{"line_number":106,"context_line":"    :type exception_checker: callable"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    :param jitter: determine increase retry interval use jitter or not"},{"line_number":109,"context_line":"    :type jitter: bool"},{"line_number":110,"context_line":"    \"\"\""},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_17850b07","line":108,"in_reply_to":"bf659307_40250d08","updated":"2018-04-13 01:24:49.000000000","message":"Yes, very useful supplementary note.","commit_id":"46bfd3c812fe4c5fdc3d64d9a21fbc6e53078de2"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"0c62b0f9defed0709667c9e724838e8fd893189c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                        # deadlock is detected. With the jitter,"},{"line_number":166,"context_line":"                        # sleep_time \u003d [0, next_interval), otherwise, without"},{"line_number":167,"context_line":"                        # the jitter, sleep_time \u003d next_interval."},{"line_number":168,"context_line":"                        if isinstance(e, exception.DBDeadlock):"},{"line_number":169,"context_line":"                            jitter \u003d True"},{"line_number":170,"context_line":"                        sleep_time, next_interval \u003d self._get_inc_interval("},{"line_number":171,"context_line":"                            next_interval, jitter)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_600a9179","line":168,"updated":"2018-04-12 15:25:37.000000000","message":"simliar thing here :)\n\nif isinstance(e, execption..):\n   jitter \u003d True\nelse:\n   jitter \u003d self.jitter\n\n:)","commit_id":"46bfd3c812fe4c5fdc3d64d9a21fbc6e53078de2"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"618c9adb03ea98fa1d9a3ad847b8aebf3a51b571","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                        # deadlock is detected. With the jitter,"},{"line_number":166,"context_line":"                        # sleep_time \u003d [0, next_interval), otherwise, without"},{"line_number":167,"context_line":"                        # the jitter, sleep_time \u003d next_interval."},{"line_number":168,"context_line":"                        if isinstance(e, exception.DBDeadlock):"},{"line_number":169,"context_line":"                            jitter \u003d True"},{"line_number":170,"context_line":"                        sleep_time, next_interval \u003d self._get_inc_interval("},{"line_number":171,"context_line":"                            next_interval, jitter)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_578f0329","line":168,"in_reply_to":"bf659307_600a9179","updated":"2018-04-13 01:24:49.000000000","message":"Yes, it\u0027s more readable.","commit_id":"46bfd3c812fe4c5fdc3d64d9a21fbc6e53078de2"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"0c62b0f9defed0709667c9e724838e8fd893189c","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # The \"sleep_time\" means the real time to sleep:"},{"line_number":189,"context_line":"        # - Without jitter: sleep_time \u003d 2 ** retry_times \u003d n"},{"line_number":190,"context_line":"        # - With jitter:    sleep_time \u003d [0, 2 ** retry_times) \u003c n"},{"line_number":191,"context_line":"        sleep_time \u003d n \u003d n * 2"},{"line_number":192,"context_line":"        if jitter:"},{"line_number":193,"context_line":"            sleep_time \u003d random.uniform(0, n)"},{"line_number":194,"context_line":"        return min(sleep_time, self.max_retry_interval), n"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_c0303d59","line":191,"updated":"2018-04-12 15:25:37.000000000","message":"total nit....  wouldn\u0027t this be clearer as:\n\nif jitter:\n   sleep_time \u003d random.uniform(..)\nelse:\n   sleep_time \u003d n \u003d n *2","commit_id":"46bfd3c812fe4c5fdc3d64d9a21fbc6e53078de2"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"618c9adb03ea98fa1d9a3ad847b8aebf3a51b571","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # The \"sleep_time\" means the real time to sleep:"},{"line_number":189,"context_line":"        # - Without jitter: sleep_time \u003d 2 ** retry_times \u003d n"},{"line_number":190,"context_line":"        # - With jitter:    sleep_time \u003d [0, 2 ** retry_times) \u003c n"},{"line_number":191,"context_line":"        sleep_time \u003d n \u003d n * 2"},{"line_number":192,"context_line":"        if jitter:"},{"line_number":193,"context_line":"            sleep_time \u003d random.uniform(0, n)"},{"line_number":194,"context_line":"        return min(sleep_time, self.max_retry_interval), n"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_9797db45","line":191,"in_reply_to":"bf659307_c0303d59","updated":"2018-04-13 01:24:49.000000000","message":"n \u003d n * 2\nif jitter:\n    sleep_time \u003d random.uniform(0, n)\nelse:\n    sleep_time \u003d n\n\nActually, should as above, we need n \u003d n * 2 first.","commit_id":"46bfd3c812fe4c5fdc3d64d9a21fbc6e53078de2"},{"author":{"_account_id":11816,"name":"mike bayer","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"5a02289e704c48dc55365144606427a20de38454","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        # The \"sleep_time\" means the real time to sleep:"},{"line_number":191,"context_line":"        # - Without jitter: sleep_time \u003d 2 ** retry_times \u003d n"},{"line_number":192,"context_line":"        # - With jitter:    sleep_time \u003d [0, 2 ** retry_times) \u003c n"},{"line_number":193,"context_line":"        n \u003d n * 2"},{"line_number":194,"context_line":"        if jitter:"},{"line_number":195,"context_line":"            sleep_time \u003d random.uniform(0, n)"},{"line_number":196,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f6a8fd7_c45c514d","line":193,"updated":"2018-04-17 17:48:33.000000000","message":"easier to read, the last time I even missed that double assignment :).","commit_id":"4c205341797da9e00e8fa176ca6dde3cbd400ca1"}],"oslo_db/tests/test_api.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f0f2c42e90bed8393c8d3507cf5c7b3e6e3a7ec7","unresolved":false,"context_lines":[{"line_number":304,"context_line":"            self.assertEqual(2 * i, sleep_time)"},{"line_number":305,"context_line":"        for i in (8, 16, 32):"},{"line_number":306,"context_line":"            sleep_time, n \u003d x._get_inc_interval(i, False)"},{"line_number":307,"context_line":"            self.assertTrue(x.max_retry_interval \u003e\u003d sleep_time)"},{"line_number":308,"context_line":"            self.assertEqual(2 * i, n)"},{"line_number":309,"context_line":"            sleep_time, n \u003d x._get_inc_interval(i, True)"},{"line_number":310,"context_line":"            self.assertTrue(x.max_retry_interval \u003e\u003d sleep_time)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_1a024070","line":307,"updated":"2018-04-11 17:27:40.000000000","message":"With no jitter this should be exactly equal, right?","commit_id":"c14a0f7200fe23b54a5b9b2b5646417ca0dda31f"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"30f2f46aec8c987b73b929fefae7e921c0d1548c","unresolved":false,"context_lines":[{"line_number":304,"context_line":"            self.assertEqual(2 * i, sleep_time)"},{"line_number":305,"context_line":"        for i in (8, 16, 32):"},{"line_number":306,"context_line":"            sleep_time, n \u003d x._get_inc_interval(i, False)"},{"line_number":307,"context_line":"            self.assertTrue(x.max_retry_interval \u003e\u003d sleep_time)"},{"line_number":308,"context_line":"            self.assertEqual(2 * i, n)"},{"line_number":309,"context_line":"            sleep_time, n \u003d x._get_inc_interval(i, True)"},{"line_number":310,"context_line":"            self.assertTrue(x.max_retry_interval \u003e\u003d sleep_time)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_1ec9c957","line":307,"in_reply_to":"bf659307_1a024070","updated":"2018-04-12 01:47:35.000000000","message":"Yeah, good catch, I will update soon.","commit_id":"c14a0f7200fe23b54a5b9b2b5646417ca0dda31f"}]}
