)]}'
{"id":"openstack%2Fpython-swiftclient~123118","triplet_id":"openstack%2Fpython-swiftclient~master~I40dbd7ec344d1ecaac5f7574d6f27095c9c3e4bc","project":"openstack/python-swiftclient","branch":"master","topic":"123118","hashtags":[],"change_id":"I40dbd7ec344d1ecaac5f7574d6f27095c9c3e4bc","subject":"Fix race condition with _retry","status":"ABANDONED","created":"2014-09-22 12:56:39.000000000","updated":"2014-12-11 18:01:00.000000000","total_comment_count":2,"unresolved_comment_count":0,"has_review_started":true,"meta_rev_id":"9b63d130cb9f3e56eec72200d5867c29dee71c90","_number":123118,"virtual_id_number":123118,"owner":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"actions":{},"labels":{"Verified":{"recommended":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"all":[{"value":1,"date":"2014-10-01 11:23:22.000000000","_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},{"date":"2014-10-17 03:58:58.000000000","_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},{"date":"2014-10-01 10:21:42.000000000","_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","value":1,"default_value":0,"optional":true},"Code-Review":{"disliked":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":3,"name":"Jenkins","username":"jenkins"},{"value":-1,"date":"2014-10-04 16:56:14.000000000","permitted_voting_range":{"min":-1,"max":1},"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"value":-1,"date":"2014-10-13 13:50:31.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},{"value":0,"permitted_voting_range":{"min":-2,"max":2},"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","value":-1,"default_value":0,"optional":true},"Workflow":{"all":[{"_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},{"value":0,"permitted_voting_range":{"min":-1,"max":0},"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"REVIEWER":[{"_account_id":3,"name":"Jenkins","username":"jenkins"},{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2014-09-22 21:58:21.000000000","updated_by":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"reviewer":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"state":"REVIEWER"},{"updated":"2014-10-01 11:23:22.000000000","updated_by":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"reviewer":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"state":"REVIEWER"},{"updated":"2014-10-04 16:56:14.000000000","updated_by":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"reviewer":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"state":"REVIEWER"},{"updated":"2014-10-13 13:50:31.000000000","updated_by":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"reviewer":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"state":"REVIEWER"},{"updated":"2014-10-17 03:58:58.000000000","updated_by":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"reviewer":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"state":"REVIEWER"}],"messages":[{"id":"7730b3d457aa5a59049f4aab2badc8250a9787e0","author":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"date":"2014-09-22 12:56:39.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"3031edcf1402f1b64e40697b024d82649640e4c5","author":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"date":"2014-09-22 14:29:00.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded.\n\n- gate-python-swiftclient-pep8 http://logs.openstack.org/18/123118/1/check/gate-python-swiftclient-pep8/345d8dc : SUCCESS in 55s\n- gate-python-swiftclient-docs http://docs-draft.openstack.org/18/123118/1/check/gate-python-swiftclient-docs/077a625/doc/build/html/ : SUCCESS in 1m 03s\n- gate-python-swiftclient-python26 http://logs.openstack.org/18/123118/1/check/gate-python-swiftclient-python26/4f944f4 : SUCCESS in 1m 09s\n- gate-python-swiftclient-python27 http://logs.openstack.org/18/123118/1/check/gate-python-swiftclient-python27/803ba3d : SUCCESS in 2m 58s\n- gate-python-swiftclient-python33 http://logs.openstack.org/18/123118/1/check/gate-python-swiftclient-python33/2197ce0 : SUCCESS in 3m 01s\n- check-tempest-dsvm-full http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-full/b9a75c7 : SUCCESS in 1h 02m 24s\n- check-tempest-dsvm-postgres-full http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-postgres-full/6c5002c : SUCCESS in 55m 53s\n- check-tempest-dsvm-neutron-full http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-neutron-full/d8e676d : SUCCESS in 1h 02m 44s\n- check-tempest-dsvm-neutron-heat-slow http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-neutron-heat-slow/b346d5a : SUCCESS in 23m 36s\n- check-grenade-dsvm http://logs.openstack.org/18/123118/1/check/check-grenade-dsvm/088740d : SUCCESS in 45m 37s\n- gate-tempest-dsvm-large-ops http://logs.openstack.org/18/123118/1/check/gate-tempest-dsvm-large-ops/fd719d3 : SUCCESS in 19m 52s\n- gate-tempest-dsvm-neutron-large-ops http://logs.openstack.org/18/123118/1/check/gate-tempest-dsvm-neutron-large-ops/a7327c1 : SUCCESS in 17m 58s\n- check-tempest-dsvm-full-havana http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-full-havana/be4e668 : FAILURE in 10m 49s (non-voting)\n- check-tempest-dsvm-neutron-havana http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-neutron-havana/941776b : FAILURE in 12m 09s (non-voting)\n- check-tempest-dsvm-full-icehouse http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-full-icehouse/75e5754 : SUCCESS in 46m 59s\n- check-tempest-dsvm-neutron-icehouse http://logs.openstack.org/18/123118/1/check/check-tempest-dsvm-neutron-icehouse/946d3bb : SUCCESS in 57m 54s\n- gate-python-swiftclient-pypy http://logs.openstack.org/18/123118/1/check/gate-python-swiftclient-pypy/f1ed4d8 : SUCCESS in 1m 09s\n- check-swift-dsvm-functional http://logs.openstack.org/18/123118/1/check/check-swift-dsvm-functional/62f5a7e : SUCCESS in 18m 06s","accounts_in_message":[],"_revision_number":1},{"id":"03c8f36ca017ee1e53e33ea94ad5e481729c9495","author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"date":"2014-09-22 21:58:21.000000000","message":"Patch Set 1: Code-Review+2\n\nSeems reasonable.","accounts_in_message":[],"_revision_number":1},{"id":"26c1e810732adfba02e0a04024a1c061cfe6ebfc","author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"date":"2014-09-23 17:16:56.000000000","message":"Patch Set 1: Code-Review-1\n\nA quick search through swiftclient/service.py shows a number of places where Connection.attempts is read e.g. line 1064.","accounts_in_message":[],"_revision_number":1},{"id":"df3309657f0ad22f84a6228230d478648bd81583","author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"date":"2014-09-23 17:26:31.000000000","message":"Patch Set 1:\n\n(1 comment)\n\n(Hit publish too soon...)\n\nDo we have examples of where multiple threads are using the same instance of Connection?\n\nIt seems that the SwiftService class uses a Connection instance to maintain the count of retry attempts, so should we just add a comment saying that Connection is not thread-safe?","accounts_in_message":[],"_revision_number":1},{"id":"375b3bf3410b9de6db6a5a558c696cd2d6539944","author":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"date":"2014-10-01 09:48:17.000000000","message":"Patch Set 1:\n\nAlistair: Why would we want Connection to not be thread safe when seemingly the only thing stopping it from being so is the internal reporting mechanisms?\n\nThe use case here is for os-loganalyzer. For example, this change which we\u0027d like to go in: \nhttps://review.openstack.org/#/c/122159/1/os_loganalyze/generator.py\n\nWhat we want to do is have the swiftclient handle the authentication with keystone so that we can then keep the session active and download many logs from multiple http connections (this will be used to serve all openstack infra logs in the future).\n\nI suspect this will be a useful feature for swiftclient to have and I wouldn\u0027t be surprised if a lot of people are using the client library expecting it to be thread safe. For example, any kind of CDN built on it.","accounts_in_message":[],"_revision_number":1},{"id":"d4b452e3e54d34116c63ff63ad7917c61b04a4df","author":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"date":"2014-10-01 10:18:34.000000000","message":"Patch Set 1:\n\n(1 comment)","accounts_in_message":[],"_revision_number":1},{"id":"56aacd975e25236aa7b4f68a062f2aa1f3b27479","author":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"date":"2014-10-01 10:19:49.000000000","message":"Uploaded patch set 2.","accounts_in_message":[],"_revision_number":2},{"id":"44f3ca9c0acbd4ad6ffd12cfa6054b7b50090e0b","author":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"date":"2014-10-01 10:21:42.000000000","message":"Patch Set 2:\n\nservice.py and shell.py still try and tell how many attempts there are. To keep this functionality we might need to have _retry return a tuple which is clearly a large api change. So I\u0027m stuck on ideas for this, but perhaps we could pass an attempts callback to _retry that then allows the user (in this case service.py) to register a method to count the attempts?\n\nThoughts?","accounts_in_message":[],"_revision_number":2},{"id":"e9a4cb604a89baa01febaa125a31fa042632a0bb","author":{"_account_id":3,"name":"Jenkins","username":"jenkins"},"date":"2014-10-01 11:23:22.000000000","message":"Patch Set 2: Verified+1\n\nBuild succeeded.\n\n- gate-python-swiftclient-pep8 http://logs.openstack.org/18/123118/2/check/gate-python-swiftclient-pep8/afa7323 : SUCCESS in 58s\n- gate-python-swiftclient-docs http://docs-draft.openstack.org/18/123118/2/check/gate-python-swiftclient-docs/a2c82d5/doc/build/html/ : SUCCESS in 41s\n- gate-python-swiftclient-python26 http://logs.openstack.org/18/123118/2/check/gate-python-swiftclient-python26/6867a13 : SUCCESS in 1m 17s\n- gate-python-swiftclient-python27 http://logs.openstack.org/18/123118/2/check/gate-python-swiftclient-python27/e60ba6c : SUCCESS in 1m 32s\n- gate-python-swiftclient-python33 http://logs.openstack.org/18/123118/2/check/gate-python-swiftclient-python33/36e20a5 : SUCCESS in 2m 57s\n- check-tempest-dsvm-full http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-full/e1e4cde : SUCCESS in 56m 24s\n- check-tempest-dsvm-postgres-full http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-postgres-full/c741932 : SUCCESS in 44m 19s\n- check-tempest-dsvm-neutron-full http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-neutron-full/ad526cf : SUCCESS in 53m 39s\n- check-tempest-dsvm-neutron-heat-slow http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-neutron-heat-slow/cce50a0 : SUCCESS in 20m 12s\n- check-grenade-dsvm http://logs.openstack.org/18/123118/2/check/check-grenade-dsvm/ca98b9b : SUCCESS in 47m 31s\n- gate-tempest-dsvm-large-ops http://logs.openstack.org/18/123118/2/check/gate-tempest-dsvm-large-ops/75b8113 : SUCCESS in 26m 08s\n- gate-tempest-dsvm-neutron-large-ops http://logs.openstack.org/18/123118/2/check/gate-tempest-dsvm-neutron-large-ops/7415011 : SUCCESS in 23m 31s\n- check-tempest-dsvm-full-havana http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-full-havana/8eb4524 : SUCCESS in 34m 34s (non-voting)\n- check-tempest-dsvm-neutron-havana http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-neutron-havana/816327c : SUCCESS in 40m 32s (non-voting)\n- check-tempest-dsvm-full-icehouse http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-full-icehouse/e6fa013 : SUCCESS in 51m 55s\n- check-tempest-dsvm-neutron-icehouse http://logs.openstack.org/18/123118/2/check/check-tempest-dsvm-neutron-icehouse/c155559 : SUCCESS in 57m 42s\n- gate-python-swiftclient-pypy http://logs.openstack.org/18/123118/2/check/gate-python-swiftclient-pypy/f59f632 : SUCCESS in 1m 19s\n- check-swift-dsvm-functional http://logs.openstack.org/18/123118/2/check/check-swift-dsvm-functional/645c9f2 : SUCCESS in 20m 59s","accounts_in_message":[],"_revision_number":2},{"id":"5ff61c190b0d3ce5c1a9228c4c462f896f7007fc","author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"date":"2014-10-04 16:56:14.000000000","message":"Patch Set 2: Code-Review-1\n\n\u003e Why would we want Connection to not be thread safe when seemingly the only thing stopping it from being so is the internal reporting mechanisms?\n\u003e [...]\n\u003e What we want to do is have the swiftclient handle the authentication with keystone so that we can then keep the session active and download many logs from multiple http connections (this will be used to serve all openstack infra logs in the future).\n\nIt appears to me that since Connection includes http_conn, sharing of self.attempts between threads is the least of your problems.\n\nYou have to run authentication to completion, get your token and then use multiply Connection(preauthtoken\u003d) instances or even roll your own HTTPConnection by hand if you so desire.","accounts_in_message":[],"_revision_number":2},{"id":"889a7c395b88c7a175da0088bf71008c2e7e8cec","author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"date":"2014-10-13 13:50:31.000000000","message":"Patch Set 2: Code-Review-1\n\n@Joshua sorry its taken we a while to return to this. As Pete points out a Connection instance also creates an HTTPConnection instance which maintains the state of each request/response using instance variables, so should not be shared across multiple request threads.\n\nIf your goal is to re-use the results of a keystone auth then you could construct a first Connection \u0027conn1\u0027, trigger conn1.get_auth()* to set auth parameters, then in your generator create fresh Connection instances, but pass the constructor the kwargs preauthurl\u003dconn1.url, preauthtoken\u003dconn1.token.\n\n* It may be that Connection.get_auth() needs to be modified to set self.url, self.token so that a call to conn1.get_auth() achieves this goal. Alternatively, you could call _retry() passing func\u003d\u003ca no-op lambda\u003e.","accounts_in_message":[],"_revision_number":2},{"id":"35ece362b7879d0e47ed088902363e6333879c85","author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"date":"2014-10-17 03:58:58.000000000","message":"Patch Set 2:\n\noh yeah!  I saw a thread safe implementation of Connection once:\n\nhttps://github.com/rackerlabs/lunr/blob/master/lunr/storage/helper/utils/client/swift.py\n\nIIRC it was mainly just adding a connection pool that we can grab connections out of in retry and pass them out to the underlying functions; and moving a few instance variables to locals in the function.\n\nI\u0027ve seen more than a few people try to use a Connection like it was thread-safe; even if we set the default pool size to 1 to force people to think about if they really want to use the connection like this - it might still be useful just from a safety aspect.","accounts_in_message":[],"_revision_number":2},{"id":"dde1e2e219ae6efc3bba198e258c8e0de4e94d5e","author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"date":"2014-12-11 18:01:00.000000000","message":"Abandoned\n\nAbandoning due to lack of activity since the last negative review. You can restore the change if you want to keep working on it.","accounts_in_message":[],"_revision_number":2}],"current_revision_number":2,"current_revision":"6527f3c1b1ee62afce8d80ec009ff9604bcc086e","revisions":{"4b96f1fa2dd02a3780a13e601918e7ec51aa7f0f":{"kind":"REWORK","_number":1,"created":"2014-09-22 12:56:39.000000000","uploader":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"ref":"refs/changes/18/123118/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/python-swiftclient","ref":"refs/changes/18/123118/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/1"}}},"commit":{"parents":[{"commit":"8f1b394325804c23ac18e7f9da6cb56a3b95eed2","subject":"Stop creating extraneous directories","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/8f1b394325804c23ac18e7f9da6cb56a3b95eed2"}]}],"author":{"name":"Joshua Hesketh","email":"josh@nitrotech.org","date":"2014-09-22 12:53:03.000000000","tz":600},"committer":{"name":"Joshua Hesketh","email":"josh@nitrotech.org","date":"2014-09-22 12:56:32.000000000","tz":600},"subject":"Fix race condition with _retry","message":"Fix race condition with _retry\n\nStoring the attempts as an instance variable on _retry() is a race\ncondition where multiple api calls may clash causing the count\nto be wrong.\n\nAs attempts should be a local variable it is untestable without\nmocking the whole method. Rather the unittests should ensure that\n_retry does the right thing without worrying about its internals.\n\nChange-Id: I40dbd7ec344d1ecaac5f7574d6f27095c9c3e4bc\nPartial-Bug: #1372429\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/4b96f1fa2dd02a3780a13e601918e7ec51aa7f0f"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/4b96f1fa2dd02a3780a13e601918e7ec51aa7f0f"}]},"branch":"refs/heads/master"},"6527f3c1b1ee62afce8d80ec009ff9604bcc086e":{"kind":"REWORK","_number":2,"created":"2014-10-01 10:19:49.000000000","uploader":{"_account_id":7069,"name":"Joshua Hesketh","email":"josh@nitrotech.org","username":"jhesketh"},"ref":"refs/changes/18/123118/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/python-swiftclient","ref":"refs/changes/18/123118/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/python-swiftclient refs/changes/18/123118/2"}}},"commit":{"parents":[{"commit":"8f1b394325804c23ac18e7f9da6cb56a3b95eed2","subject":"Stop creating extraneous directories","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/8f1b394325804c23ac18e7f9da6cb56a3b95eed2"}]}],"author":{"name":"Joshua Hesketh","email":"josh@nitrotech.org","date":"2014-09-22 12:53:03.000000000","tz":600},"committer":{"name":"Joshua Hesketh","email":"josh@nitrotech.org","date":"2014-10-01 10:18:39.000000000","tz":600},"subject":"Fix race condition with _retry","message":"Fix race condition with _retry\n\nStoring the attempts as an instance variable on _retry() is a race\ncondition where multiple api calls may clash causing the count\nto be wrong.\n\nAs attempts should be a local variable it is untestable without\nmocking the whole method. Rather the unittests should ensure that\n_retry does the right thing without worrying about its internals.\n\nChange-Id: I40dbd7ec344d1ecaac5f7574d6f27095c9c3e4bc\nPartial-Bug: #1372429\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/6527f3c1b1ee62afce8d80ec009ff9604bcc086e"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/python-swiftclient/commit/6527f3c1b1ee62afce8d80ec009ff9604bcc086e"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[],"submit_requirements":[]}
