)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"42062553dedba3f9f94ba023a5da778fd768d98f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"will mean we should be able to remove the .first() call and instead"},{"line_number":17,"context_line":"use .one(). The current code that uses .first() is not correct"},{"line_number":18,"context_line":"because there is no order_by() applied on the SQL query and"},{"line_number":19,"context_line":"therefore the returned \"first record\" is indeterminate."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This workaround fix removed misleading note and exception and"},{"line_number":22,"context_line":"added order_by() to ensure that the same record is updated every time."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3ac371cc_cd9ad36d","line":19,"updated":"2016-08-17 16:39:46.000000000","message":"++","commit_id":"8e9721c28a03915d4d8d597d601404fb93b90ed9"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"aa35c4c3a2f7ac6a76cf1948c68c2aafd58b821e","unresolved":false,"context_lines":[{"line_number":5235,"context_line":"        bwusage.last_ctr_out \u003d last_ctr_out"},{"line_number":5236,"context_line":"        try:"},{"line_number":5237,"context_line":"            bwusage.save(session\u003dsession)"},{"line_number":5238,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":5239,"context_line":"            # NOTE(sirp): Possible race if two greenthreads attempt to create"},{"line_number":5240,"context_line":"            # the usage entry at the same time. First one wins."},{"line_number":5241,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a8ffd7b_4ea4b849","side":"PARENT","line":5238,"updated":"2015-11-30 11:00:30.000000000","message":"Indeed, this does not seem to be possible according to what we have in DB schema:\n\nhttp://paste.openstack.org/show/480339/\n\n(i.e. no additional unique constraints and PK is the autogenerated ID column)\n\nBut I think the code now works not in the way it was expected: on lines #5217-5225 we try to fetch the row from DB and create one if needed. Without a unique constraint on (start_period, uuid, mac) in the DB it\u0027s still possible we\u0027ll end up with 2 rows should 2 green threads try to create BandwidthUsage entries simultaneously.","commit_id":"7bc2171869e2d7a670dc3c93494cf6ca05cac2fc"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"6cb01e943f185c03a6886a2247d1f3f23585c902","unresolved":false,"context_lines":[{"line_number":5235,"context_line":"        bwusage.last_ctr_out \u003d last_ctr_out"},{"line_number":5236,"context_line":"        try:"},{"line_number":5237,"context_line":"            bwusage.save(session\u003dsession)"},{"line_number":5238,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":5239,"context_line":"            # NOTE(sirp): Possible race if two greenthreads attempt to create"},{"line_number":5240,"context_line":"            # the usage entry at the same time. First one wins."},{"line_number":5241,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d097ce38","side":"PARENT","line":5238,"in_reply_to":"7a740942_e429f338","updated":"2015-12-09 17:02:10.000000000","message":"The reason *to* remove this code is because the code comment below is misleading. We should remove misleading comments in the codebase where we can :)","commit_id":"7bc2171869e2d7a670dc3c93494cf6ca05cac2fc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"706c2ff68665b803e684411ee90a5d3043395bda","unresolved":false,"context_lines":[{"line_number":5235,"context_line":"        bwusage.last_ctr_out \u003d last_ctr_out"},{"line_number":5236,"context_line":"        try:"},{"line_number":5237,"context_line":"            bwusage.save(session\u003dsession)"},{"line_number":5238,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":5239,"context_line":"            # NOTE(sirp): Possible race if two greenthreads attempt to create"},{"line_number":5240,"context_line":"            # the usage entry at the same time. First one wins."},{"line_number":5241,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_e429f338","side":"PARENT","line":5238,"in_reply_to":"9a8ffd7b_4ea4b849","updated":"2015-12-09 14:57:36.000000000","message":"If we do find a row, we return on L5225 and don\u0027t get here, so I don\u0027t see how this code protects us in that case.\n\nI agree that this seems like code we don\u0027t need. However, it was added in 2013 and for a reason, although the bug is extremely light on detail:\n\nhttps://bugs.launchpad.net/nova/+bug/1199468\n\nWhat is the reason _to_ remove it?","commit_id":"7bc2171869e2d7a670dc3c93494cf6ca05cac2fc"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"6cb01e943f185c03a6886a2247d1f3f23585c902","unresolved":false,"context_lines":[{"line_number":5235,"context_line":"        bwusage.last_ctr_out \u003d last_ctr_out"},{"line_number":5236,"context_line":"        try:"},{"line_number":5237,"context_line":"            bwusage.save(session\u003dsession)"},{"line_number":5238,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":5239,"context_line":"            # NOTE(sirp): Possible race if two greenthreads attempt to create"},{"line_number":5240,"context_line":"            # the usage entry at the same time. First one wins."},{"line_number":5241,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_90af062b","side":"PARENT","line":5238,"in_reply_to":"9a8ffd7b_4ea4b849","updated":"2015-12-09 17:02:10.000000000","message":"Roman, you are (as always!) correct. I will log a bug to create a unique constraint on those fields to prevent multiple bw usage records existing for the same date range and UUID. The fix for this will mean we should be able to remove the .first() call on line 5221 and instead use .one(). The current code that uses .first() is totally buggy because there is no order_by() applied on the SQL query and therefore the returned \"first record\" is indeterminate.\n\nQ.E.D.","commit_id":"7bc2171869e2d7a670dc3c93494cf6ca05cac2fc"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"b26b42ed2d4ab4a6aa0a4c7a31826ad6c1669860","unresolved":false,"context_lines":[{"line_number":5250,"context_line":"                        filter_by(start_period\u003dts_values[\u0027start_period\u0027]).\\"},{"line_number":5251,"context_line":"                        filter_by(uuid\u003duuid).\\"},{"line_number":5252,"context_line":"                        filter_by(mac\u003dmac).\\"},{"line_number":5253,"context_line":"                        order_by(asc(models.BandwidthUsage.id)).\\"},{"line_number":5254,"context_line":"                        first()"},{"line_number":5255,"context_line":""},{"line_number":5256,"context_line":"        if bw_usage:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_c543bead","line":5253,"updated":"2016-01-06 15:15:40.000000000","message":"This is fine, but could you please add a note here why we need order_by()?","commit_id":"6abd7c1457ba057fe6beb0247d51d87b65758fe6"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"782dff2ecb77928d496c8ca70481beb07330f6e1","unresolved":false,"context_lines":[{"line_number":5250,"context_line":"                        filter_by(start_period\u003dts_values[\u0027start_period\u0027]).\\"},{"line_number":5251,"context_line":"                        filter_by(uuid\u003duuid).\\"},{"line_number":5252,"context_line":"                        filter_by(mac\u003dmac).\\"},{"line_number":5253,"context_line":"                        order_by(asc(models.BandwidthUsage.id)).\\"},{"line_number":5254,"context_line":"                        first()"},{"line_number":5255,"context_line":""},{"line_number":5256,"context_line":"        if bw_usage:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_10194888","line":5253,"in_reply_to":"fa69d971_c543bead","updated":"2016-01-11 12:44:20.000000000","message":"Good idea, done!","commit_id":"6abd7c1457ba057fe6beb0247d51d87b65758fe6"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"dc87c7438021f60045a6a8733b80b312dcfba02f","unresolved":false,"context_lines":[{"line_number":5502,"context_line":"        filter_by(start_period\u003dts_values[\u0027start_period\u0027]).\\"},{"line_number":5503,"context_line":"        filter_by(uuid\u003duuid).\\"},{"line_number":5504,"context_line":"        filter_by(mac\u003dmac).\\"},{"line_number":5505,"context_line":"        order_by(asc(models.BandwidthUsage.id)).\\"},{"line_number":5506,"context_line":"        first()"},{"line_number":5507,"context_line":""},{"line_number":5508,"context_line":"    if bw_usage:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_efff4732","line":5505,"updated":"2016-06-06 13:57:18.000000000","message":"nit: we could have add a unit test what would mock model_query() and ensure order_by() is called","commit_id":"73ff98c6cb17d90a12ec78a928b972b2b1aca945"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"3cafe1b4de6751dd69630f5f76cca2261f37c279","unresolved":false,"context_lines":[{"line_number":8539,"context_line":""},{"line_number":8540,"context_line":"    def _create_bw_usage(self, context, uuid, mac, start_period, bw_in, bw_out,"},{"line_number":8541,"context_line":"                         last_ctr_in, last_ctr_out, last_refreshed\u003dNone):"},{"line_number":8542,"context_line":"        with sqlalchemy_api.main_context_manager.writer.using(context):"},{"line_number":8543,"context_line":"            bwusage \u003d models.BandwidthUsage()"},{"line_number":8544,"context_line":"            bwusage.start_period \u003d start_period"},{"line_number":8545,"context_line":"            bwusage.uuid \u003d uuid"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_fdd928f4","line":8542,"updated":"2016-08-01 14:05:32.000000000","message":"nit: we should probably use get_context_manager() helper function here instead of referring to main_context_manager instance directly for the sake of consistency with the corresponding production code for creation of BandwidhUsage entries","commit_id":"d67ab4914e2e4fa987114d449477cc9988996e04"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"e2fab68a9fea97b837da129632f976dc7f8c538b","unresolved":false,"context_lines":[{"line_number":8539,"context_line":""},{"line_number":8540,"context_line":"    def _create_bw_usage(self, context, uuid, mac, start_period, bw_in, bw_out,"},{"line_number":8541,"context_line":"                         last_ctr_in, last_ctr_out, last_refreshed\u003dNone):"},{"line_number":8542,"context_line":"        with sqlalchemy_api.main_context_manager.writer.using(context):"},{"line_number":8543,"context_line":"            bwusage \u003d models.BandwidthUsage()"},{"line_number":8544,"context_line":"            bwusage.start_period \u003d start_period"},{"line_number":8545,"context_line":"            bwusage.uuid \u003d uuid"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_6c5fda75","line":8542,"in_reply_to":"bacf61ea_fdd928f4","updated":"2016-08-03 11:30:48.000000000","message":"Done","commit_id":"d67ab4914e2e4fa987114d449477cc9988996e04"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"3cafe1b4de6751dd69630f5f76cca2261f37c279","unresolved":false,"context_lines":[{"line_number":8571,"context_line":"        self._create_bw_usage(self.ctxt, **bw_usage)"},{"line_number":8572,"context_line":""},{"line_number":8573,"context_line":"        # check that we have two equal bw_usages"},{"line_number":8574,"context_line":"        with sqlalchemy_api.main_context_manager.reader.using(self.ctxt):"},{"line_number":8575,"context_line":"            count \u003d sqlalchemy_api.model_query("},{"line_number":8576,"context_line":"                self.ctxt, models.BandwidthUsage, read_deleted\u003d\u0027yes\u0027).\\"},{"line_number":8577,"context_line":"                filter_by(start_period\u003dstart_period).\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_9df10c6e","line":8574,"updated":"2016-08-01 14:05:32.000000000","message":"ditto","commit_id":"d67ab4914e2e4fa987114d449477cc9988996e04"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"e2fab68a9fea97b837da129632f976dc7f8c538b","unresolved":false,"context_lines":[{"line_number":8571,"context_line":"        self._create_bw_usage(self.ctxt, **bw_usage)"},{"line_number":8572,"context_line":""},{"line_number":8573,"context_line":"        # check that we have two equal bw_usages"},{"line_number":8574,"context_line":"        with sqlalchemy_api.main_context_manager.reader.using(self.ctxt):"},{"line_number":8575,"context_line":"            count \u003d sqlalchemy_api.model_query("},{"line_number":8576,"context_line":"                self.ctxt, models.BandwidthUsage, read_deleted\u003d\u0027yes\u0027).\\"},{"line_number":8577,"context_line":"                filter_by(start_period\u003dstart_period).\\"}],"source_content_type":"text/x-python","patch_set":7,"id":"bacf61ea_cc508661","line":8574,"in_reply_to":"bacf61ea_9df10c6e","updated":"2016-08-03 11:30:48.000000000","message":"Done","commit_id":"d67ab4914e2e4fa987114d449477cc9988996e04"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"0d703b5897202bfca4001f7b76c2a11c4ad7b967","unresolved":false,"context_lines":[{"line_number":8611,"context_line":""},{"line_number":8612,"context_line":"    def _create_bw_usage(self, context, uuid, mac, start_period, bw_in, bw_out,"},{"line_number":8613,"context_line":"                         last_ctr_in, last_ctr_out, last_refreshed\u003dNone):"},{"line_number":8614,"context_line":"        with sqlalchemy_api.get_context_manager(context).writer.using(context):"},{"line_number":8615,"context_line":"            bwusage \u003d models.BandwidthUsage()"},{"line_number":8616,"context_line":"            bwusage.start_period \u003d start_period"},{"line_number":8617,"context_line":"            bwusage.uuid \u003d uuid"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_70416839","line":8614,"updated":"2016-08-03 12:18:38.000000000","message":"nit: we could probably make get_context_manager() return a context manager bound to a specific context instance (the using(context) call), so that we do not have to pass context twice, but it should be done in another patch as it\u0027s a complete separate issue","commit_id":"8e9721c28a03915d4d8d597d601404fb93b90ed9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"42062553dedba3f9f94ba023a5da778fd768d98f","unresolved":false,"context_lines":[{"line_number":8656,"context_line":"        # check that order_by is called, so only the first bw_usage is updated"},{"line_number":8657,"context_line":"        with mock.patch.object(query.Query, \u0027order_by\u0027) as order_mock:"},{"line_number":8658,"context_line":"            db.bw_usage_update(self.ctxt, update_cells\u003dFalse, **bw_usage)"},{"line_number":8659,"context_line":"            self.assertTrue(order_mock.called)"},{"line_number":8660,"context_line":""},{"line_number":8661,"context_line":"    def test_bw_usage_get(self):"},{"line_number":8662,"context_line":"        now \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_2d8a871b","line":8659,"updated":"2016-08-17 16:39:46.000000000","message":"Actually, since we\u0027re already accessing the DB in these tests, how about just checking that the bw usage record with the lowest id column value is updated instead of mocking out order_by().","commit_id":"8e9721c28a03915d4d8d597d601404fb93b90ed9"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"c0f0968977fcca5b8730ce44c81479d2ee79cb0d","unresolved":false,"context_lines":[{"line_number":8656,"context_line":"        # check that order_by is called, so only the first bw_usage is updated"},{"line_number":8657,"context_line":"        with mock.patch.object(query.Query, \u0027order_by\u0027) as order_mock:"},{"line_number":8658,"context_line":"            db.bw_usage_update(self.ctxt, update_cells\u003dFalse, **bw_usage)"},{"line_number":8659,"context_line":"            self.assertTrue(order_mock.called)"},{"line_number":8660,"context_line":""},{"line_number":8661,"context_line":"    def test_bw_usage_get(self):"},{"line_number":8662,"context_line":"        now \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_4444f819","line":8659,"in_reply_to":"3ac371cc_2d8a871b","updated":"2016-08-17 18:02:51.000000000","message":"Agreed.","commit_id":"8e9721c28a03915d4d8d597d601404fb93b90ed9"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"e438fc2dcc5fd680bc72458a95131e8ffec652f0","unresolved":false,"context_lines":[{"line_number":8656,"context_line":"        # check that order_by is called, so only the first bw_usage is updated"},{"line_number":8657,"context_line":"        with mock.patch.object(query.Query, \u0027order_by\u0027) as order_mock:"},{"line_number":8658,"context_line":"            db.bw_usage_update(self.ctxt, update_cells\u003dFalse, **bw_usage)"},{"line_number":8659,"context_line":"            self.assertTrue(order_mock.called)"},{"line_number":8660,"context_line":""},{"line_number":8661,"context_line":"    def test_bw_usage_get(self):"},{"line_number":8662,"context_line":"        now \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_a9d11925","line":8659,"in_reply_to":"3ac371cc_4444f819","updated":"2016-08-18 11:07:18.000000000","message":"ok, now the test is fair, without any mocks","commit_id":"8e9721c28a03915d4d8d597d601404fb93b90ed9"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"927add7c8a476cd3e7b74da630a901d3ff211711","unresolved":false,"context_lines":[{"line_number":8631,"context_line":"        uuid \u003d \u0027fake_uuid\u0027"},{"line_number":8632,"context_line":"        mac \u003d \u0027fake_mac\u0027"},{"line_number":8633,"context_line":""},{"line_number":8634,"context_line":"        bw_usage \u003d {\u0027uuid\u0027: uuid,"},{"line_number":8635,"context_line":"                     \u0027mac\u0027: mac,"},{"line_number":8636,"context_line":"                     \u0027start_period\u0027: start_period,"},{"line_number":8637,"context_line":"                     \u0027bw_in\u0027: 100,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_b8901397","line":8634,"updated":"2016-08-19 14:04:48.000000000","message":"Pass in hard-coded id values of 1 and 2 for both the records here so you can expect a specific value below.","commit_id":"e6ac999fcbd6c51cc70e078ff2bb5632040d16a3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"927add7c8a476cd3e7b74da630a901d3ff211711","unresolved":false,"context_lines":[{"line_number":8653,"context_line":"                             \u0027last_ctr_in\u0027: 54321,"},{"line_number":8654,"context_line":"                             \u0027last_ctr_out\u0027: 67890,"},{"line_number":8655,"context_line":"                             \u0027last_refreshed\u0027: now}"},{"line_number":8656,"context_line":"        db.bw_usage_update(self.ctxt, update_cells\u003dFalse, **updated_bw_usage)"},{"line_number":8657,"context_line":""},{"line_number":8658,"context_line":"        # get both bw_usages"},{"line_number":8659,"context_line":"        bw_usages \u003d db.bw_usage_get_by_uuids(self.ctxt, [uuid], start_period)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_988d577e","line":8656,"updated":"2016-08-19 14:04:48.000000000","message":"db.bw_usage_update() returns the record that has been updated. So, instead of all the below code, you could do this instead:\n\n updated \u003d db.bw_usage_update(self.ctxt, update_cells\u003dFalse, **updated_bw_usage)\n\n # Check that we got back the record with the least ID and that\n # last_ctr_in has the updated value.\n self.assertEqual(1, updated[\u0027id\u0027])\n self.assertEqual(54321, updated[\u0027last_ctr_in\u0027])","commit_id":"e6ac999fcbd6c51cc70e078ff2bb5632040d16a3"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"52ccd73aec6812884e92c6e4fa3417021ab6d60a","unresolved":false,"context_lines":[{"line_number":8660,"context_line":"        self.assertEqual(2, len(bw_usages))"},{"line_number":8661,"context_line":""},{"line_number":8662,"context_line":"        # ensure that the first bw_usage has less id than the second"},{"line_number":8663,"context_line":"        if bw_usages[0].id \u003e bw_usages[1].id:"},{"line_number":8664,"context_line":"            bw_usages[0], bw_usages[1] \u003d bw_usages[1], bw_usages[0]"},{"line_number":8665,"context_line":""},{"line_number":8666,"context_line":"        # check that the first (with less id) was updated and the second wasn\u0027t"}],"source_content_type":"text/x-python","patch_set":10,"id":"3ac371cc_6d2ef48c","line":8663,"updated":"2016-08-18 16:02:49.000000000","message":"nit: I think sorted() call would be more readable here","commit_id":"e6ac999fcbd6c51cc70e078ff2bb5632040d16a3"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"3072776f5671168634751ea0cbbb7d8a09379b28","unresolved":false,"context_lines":[{"line_number":8660,"context_line":"        self.assertEqual(2, len(bw_usages))"},{"line_number":8661,"context_line":""},{"line_number":8662,"context_line":"        # ensure that the first bw_usage has less id than the second"},{"line_number":8663,"context_line":"        if bw_usages[0].id \u003e bw_usages[1].id:"},{"line_number":8664,"context_line":"            bw_usages[0], bw_usages[1] \u003d bw_usages[1], bw_usages[0]"},{"line_number":8665,"context_line":""},{"line_number":8666,"context_line":"        # check that the first (with less id) was updated and the second wasn\u0027t"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_450ca142","line":8663,"in_reply_to":"3ac371cc_6d2ef48c","updated":"2016-08-19 13:04:22.000000000","message":"+1.","commit_id":"e6ac999fcbd6c51cc70e078ff2bb5632040d16a3"},{"author":{"_account_id":10618,"name":"Pavel Kholkin","email":"p.v.holkin@mail.ru","username":"pkholkin"},"change_message_id":"bfafaf5865088643f95a1b17f61d848683322e1d","unresolved":false,"context_lines":[{"line_number":8644,"context_line":"                        \u0027id\u0027: id}"},{"line_number":8645,"context_line":"            self._create_bw_usage(self.ctxt, **bw_usage)"},{"line_number":8646,"context_line":""},{"line_number":8647,"context_line":"        # check taht we have two equal bw_usages"},{"line_number":8648,"context_line":"        self.assertEqual("},{"line_number":8649,"context_line":"            2, len(db.bw_usage_get_by_uuids(self.ctxt, [uuid], start_period)))"},{"line_number":8650,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1ac06dbe_707dc7b0","line":8647,"range":{"start_line":8647,"start_character":16,"end_line":8647,"end_character":20},"updated":"2016-08-22 09:51:14.000000000","message":"ops :)","commit_id":"a978978c317cfb04d77b3c6bc1087172eb2752b6"}]}
