)]}'
{"bin/swift-account-info":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        print_info(\u0027account\u0027, *args, **opts)"},{"line_number":24,"context_line":"    except InfoSystemExit:"},{"line_number":25,"context_line":"        sys.exit(1)"},{"line_number":26,"context_line":"    except sqlite3.OperationalError as e:"},{"line_number":27,"context_line":"        if count \u003d\u003d 0:"},{"line_number":28,"context_line":"            opts[\u0027stale_reads_ok\u0027] \u003d True"},{"line_number":29,"context_line":"            print(\u0027Warning: Possibly Stale Data\u0027)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"7af24918_7394b4e1","line":26,"range":{"start_line":26,"start_character":19,"end_line":26,"end_character":35},"updated":"2016-03-02 12:34:41.000000000","message":"NB: the sqlite3 docs [1] barely mention errors at all, so it\u0027s hard to know that this is the appropriate error to catch. FWIW, the MRO is:\n\n* sqlite3.OperationalError\n* sqlite3.DatabaseError\n* sqlite3.Error\n* ... various other stdlib exceptions\n\nI think this *is* the appropriate error, however; going up to DatabaseError would include things like IntegrityError which would almost certainly just be raised again if we retry.\n\n[1] https://docs.python.org/2/library/sqlite3.html","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"30e3dacc97e7495a2b66950919447b7d1fab0e21","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        print_info(\u0027account\u0027, *args, **opts)"},{"line_number":24,"context_line":"    except InfoSystemExit:"},{"line_number":25,"context_line":"        sys.exit(1)"},{"line_number":26,"context_line":"    except sqlite3.OperationalError as e:"},{"line_number":27,"context_line":"        if count \u003d\u003d 0:"},{"line_number":28,"context_line":"            opts[\u0027stale_reads_ok\u0027] \u003d True"},{"line_number":29,"context_line":"            print(\u0027Warning: Possibly Stale Data\u0027)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"5aef4532_3d28e6e1","line":26,"range":{"start_line":26,"start_character":19,"end_line":26,"end_character":35},"in_reply_to":"7af24918_7394b4e1","updated":"2016-03-09 20:27:30.000000000","message":"Should we also catch LockTimeouts here, like we do in _commit_puts_stale_ok?\n\nIf we do, we should consider lowering the timeout on the second attempt; 50s seems like a while to wait for a command to finish.","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    except InfoSystemExit:"},{"line_number":25,"context_line":"        sys.exit(1)"},{"line_number":26,"context_line":"    except sqlite3.OperationalError as e:"},{"line_number":27,"context_line":"        if count \u003d\u003d 0:"},{"line_number":28,"context_line":"            opts[\u0027stale_reads_ok\u0027] \u003d True"},{"line_number":29,"context_line":"            print(\u0027Warning: Possibly Stale Data\u0027)"},{"line_number":30,"context_line":"            run_print_info(args, opts, count\u003dcount + 1)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"7af24918_ea7f2964","line":27,"updated":"2016-03-02 12:34:41.000000000","message":"What about looking for stale_reads_ok in opts instead of using a count? Like\n\n  if not opts.get(\u0027stale_reads_ok\u0027):\n      opts[\u0027stale_reads_ok\u0027] \u003d True\n      print(\u0027Warning: Possibly Stale Data\u0027)\n      run_print_info(args, opts)","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"            print(\u0027Warning: Possibly Stale Data\u0027)"},{"line_number":30,"context_line":"            run_print_info(args, opts, count\u003dcount + 1)"},{"line_number":31,"context_line":"        else:"},{"line_number":32,"context_line":"            print(\u0027Account info failed: %s\u0027 % e)"},{"line_number":33,"context_line":"        sys.exit(1)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"7af24918_ca886d25","line":32,"updated":"2016-03-02 12:34:41.000000000","message":"Would the traceback be useful here? We would have had it before, when the OperationalError was uncaught.","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            run_print_info(args, opts, count\u003dcount + 1)"},{"line_number":31,"context_line":"        else:"},{"line_number":32,"context_line":"            print(\u0027Account info failed: %s\u0027 % e)"},{"line_number":33,"context_line":"        sys.exit(1)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":36,"context_line":"    parser \u003d OptionParser(\u0027%prog [options] ACCOUNT_DB_FILE\u0027)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"7af24918_aad6c124","line":33,"range":{"start_line":33,"start_character":8,"end_line":33,"end_character":19},"updated":"2016-03-02 12:34:41.000000000","message":"So we\u0027re always considering this an error state, even if print_info with stale_reads_ok can complete? That seems reasonable, but it may be good to be able to differentiate between \"success if I allow stale reads\" and \"OperationalError on first try and InfoSystemExit if I allow stale reads.\" Maybe sys.exit(2) here?","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"}],"bin/swift-container-info":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7e3fec75a825332e32a5cb0d5d968fe66ac1730","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        if count \u003d\u003d 0:"},{"line_number":28,"context_line":"            opts[\u0027stale_reads_ok\u0027] \u003d True"},{"line_number":29,"context_line":"            print(\u0027Warning: Possibly Stale Data\u0027)"},{"line_number":30,"context_line":"            run_print_info(args, opts)"},{"line_number":31,"context_line":"        else:"},{"line_number":32,"context_line":"            print(\u0027Container info failed: %s\u0027 % e)"},{"line_number":33,"context_line":"        sys.exit(1)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"fa0719c6_be4cecc8","line":30,"updated":"2016-03-23 23:05:03.000000000","message":"Oh, shoot! We\u0027re missing the count\u003dcount+1 like we had in swift-account-info!","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"}],"swift/account/backend.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4d9e680a09fbc93be5438a99c4cc9b238fb8b5cb","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        :param conn: DB connection object"},{"line_number":66,"context_line":"        :param put_timestamp: put timestamp"},{"line_number":67,"context_line":"        \"\"\""},{"line_number":68,"context_line":"        self.stale_reads_ok \u003d stale_reads_ok"},{"line_number":69,"context_line":"        if not self.account:"},{"line_number":70,"context_line":"            raise ValueError("},{"line_number":71,"context_line":"                \u0027Attempting to create a new database with no account set\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_99bd1dda","line":68,"updated":"2016-02-22 00:32:44.000000000","message":"Isn\u0027t this already handled in the __init__ method of swift.common.db.DatabaseBroker? So why do we need to do it here?","commit_id":"aecf81d5ceca2732c1a7f23752093f6f99daae3a"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"c07a0a60b2b242568dc00dfe76eb5b2d3cb7110d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        :param conn: DB connection object"},{"line_number":66,"context_line":"        :param put_timestamp: put timestamp"},{"line_number":67,"context_line":"        \"\"\""},{"line_number":68,"context_line":"        self.stale_reads_ok \u003d stale_reads_ok"},{"line_number":69,"context_line":"        if not self.account:"},{"line_number":70,"context_line":"            raise ValueError("},{"line_number":71,"context_line":"                \u0027Attempting to create a new database with no account set\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_650d073e","line":68,"in_reply_to":"bae84128_99bd1dda","updated":"2016-02-22 06:24:56.000000000","message":"Done","commit_id":"aecf81d5ceca2732c1a7f23752093f6f99daae3a"}],"swift/container/backend.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4d9e680a09fbc93be5438a99c4cc9b238fb8b5cb","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        Create a brand new container database (tables, indices, triggers, etc.)"},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        self.stale_reads_ok \u003d stale_reads_ok"},{"line_number":159,"context_line":"        if not self.account:"},{"line_number":160,"context_line":"            raise ValueError("},{"line_number":161,"context_line":"                \u0027Attempting to create a new database with no account set\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_998b5d1e","line":158,"updated":"2016-02-22 00:32:44.000000000","message":"again why do we do this here. stale_reads_ok is set/defined in the Broker\u0027s constructor in db.py, so applies to the account and container broker automatically and it is already saved to self.stale_reads_ok. Meaning at this point it should already be defined.\n\nOr am I missing something?","commit_id":"aecf81d5ceca2732c1a7f23752093f6f99daae3a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"4d9e680a09fbc93be5438a99c4cc9b238fb8b5cb","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        Create a brand new container database (tables, indices, triggers, etc.)"},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        self.stale_reads_ok \u003d stale_reads_ok"},{"line_number":159,"context_line":"        if not self.account:"},{"line_number":160,"context_line":"            raise ValueError("},{"line_number":161,"context_line":"                \u0027Attempting to create a new database with no account set\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_79a019a0","line":158,"updated":"2016-02-22 00:32:44.000000000","message":"again why do we do this here. stale_reads_ok is set/deinfed in the Broker\u0027s constructor in db.py, so applies to the account and container broker automatically and it is already saved to self.stale_reads_ok. Meaning at this point it should already be defined.","commit_id":"aecf81d5ceca2732c1a7f23752093f6f99daae3a"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"c07a0a60b2b242568dc00dfe76eb5b2d3cb7110d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        Create a brand new container database (tables, indices, triggers, etc.)"},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        self.stale_reads_ok \u003d stale_reads_ok"},{"line_number":159,"context_line":"        if not self.account:"},{"line_number":160,"context_line":"            raise ValueError("},{"line_number":161,"context_line":"                \u0027Attempting to create a new database with no account set\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_05719be0","line":158,"in_reply_to":"bae84128_79a019a0","updated":"2016-02-22 06:24:56.000000000","message":"Done","commit_id":"aecf81d5ceca2732c1a7f23752093f6f99daae3a"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"c07a0a60b2b242568dc00dfe76eb5b2d3cb7110d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        Create a brand new container database (tables, indices, triggers, etc.)"},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        self.stale_reads_ok \u003d stale_reads_ok"},{"line_number":159,"context_line":"        if not self.account:"},{"line_number":160,"context_line":"            raise ValueError("},{"line_number":161,"context_line":"                \u0027Attempting to create a new database with no account set\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bae84128_657867c5","line":158,"in_reply_to":"bae84128_998b5d1e","updated":"2016-02-22 06:24:56.000000000","message":"Done","commit_id":"aecf81d5ceca2732c1a7f23752093f6f99daae3a"}],"test/unit/account/test_backend.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":823,"context_line":""},{"line_number":824,"context_line":"    def test_get_info_stale_read(self):"},{"line_number":825,"context_line":"        # test getting a stale read from the db"},{"line_number":826,"context_line":"        tempdir \u003d mkdtemp()"},{"line_number":827,"context_line":"        broker_path \u003d os.path.join(tempdir, \u0027test-load-old.db\u0027)"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"        def mock_commit_puts():"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_d8b9677b","line":826,"updated":"2016-03-02 12:34:41.000000000","message":"Maybe use @with_tempdir instead?","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":833,"context_line":"            broker \u003d AccountBroker(broker_path, account\u003d\u0027real\u0027,"},{"line_number":834,"context_line":"                                   stale_reads_ok\u003dTrue)"},{"line_number":835,"context_line":"            broker.initialize(Timestamp(1).internal)"},{"line_number":836,"context_line":"            with open(broker_path + \u0027.pending\u0027, \u0027a+b\u0027) as pending:"},{"line_number":837,"context_line":"                pending.write(\u0027:\u0027)"},{"line_number":838,"context_line":"                pending.write(pickle.dumps("},{"line_number":839,"context_line":"                    # name, put_timestamp, delete_timestamp, object_count,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_b8ee1b89","line":836,"range":{"start_line":836,"start_character":22,"end_line":836,"end_character":46},"updated":"2016-03-02 12:34:41.000000000","message":"Maybe better to use broker.pending_file","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":846,"context_line":"            broker.get_info()"},{"line_number":847,"context_line":"        finally:"},{"line_number":848,"context_line":"            rmtree(tempdir)"},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"        try:"},{"line_number":851,"context_line":"            broker \u003d AccountBroker(broker_path, account\u003d\u0027real\u0027,"},{"line_number":852,"context_line":"                                   stale_reads_ok\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_1808ef2c","line":849,"updated":"2016-03-02 12:34:41.000000000","message":"I think I prefer the container tests\u0027 style of breaking these into two tests.","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"634126539612b4d16a661fd6f7281e834813aea7","unresolved":false,"context_lines":[{"line_number":862,"context_line":""},{"line_number":863,"context_line":"            broker._commit_puts \u003d mock_commit_puts"},{"line_number":864,"context_line":""},{"line_number":865,"context_line":"            try:"},{"line_number":866,"context_line":"                broker.get_info()"},{"line_number":867,"context_line":"            except sqlite3.OperationalError as err:"},{"line_number":868,"context_line":"                self.assertTrue(\u0027unable to open database file\u0027 in str(err))"}],"source_content_type":"text/x-python","patch_set":5,"id":"7af24918_0da6ef0f","line":865,"updated":"2016-03-02 12:34:41.000000000","message":"nit: Could use something like:\n\n  with self.assertRaises(sqlite3.OperationalError) as exc_context:\n      broker.get_info()\n  self.assertIn(\u0027unable to open database file\u0027, str(exc_context.exception))","commit_id":"646c5ad90e861794729cd4ec7d6ebbb54468d734"}]}
