)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4f6c0ec7338c5dc408164fa5987fcc284b256725","unresolved":false,"context_lines":[{"line_number":10,"context_line":"by creating a new row in resource_history tables each times the"},{"line_number":11,"context_line":"resource table is updated."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Each resource extention table also gain a \u0027\u003cresource_name\u003e_history\u0027 to"},{"line_number":14,"context_line":"track their history too."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: If532b5167f0bbecb94f15594f0227c537ed26f77"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9aa53dc9_072d08a7","line":13,"updated":"2015-04-07 15:02:51.000000000","message":"extension","commit_id":"7fadb74e410d7428f03be1322cd6bcc852171a4a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"326204164b2efa8ba89dae56c987d3d798acf6c6","unresolved":false,"context_lines":[{"line_number":10,"context_line":"by creating a new row in resource_history tables each times the"},{"line_number":11,"context_line":"resource table is updated."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Each resource extention table also gain a \u0027\u003cresource_name\u003e_history\u0027 to"},{"line_number":14,"context_line":"track their history too."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: If532b5167f0bbecb94f15594f0227c537ed26f77"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9aa53dc9_9d7029de","line":13,"in_reply_to":"9aa53dc9_072d08a7","updated":"2015-04-08 09:31:02.000000000","message":"Done","commit_id":"7fadb74e410d7428f03be1322cd6bcc852171a4a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a7342a257980a861afa04beb5b02b3fdc67884f4","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Keep history of updated resource attributes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change keeps history of updated resource attributes"},{"line_number":10,"context_line":"by creating a new row in resource_history tables each times the"},{"line_number":11,"context_line":"resource table is updated."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Each resource extension table also gain a \u0027\u003cresource_name\u003e_history\u0027 to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9aa53dc9_a6b19991","line":10,"updated":"2015-04-08 10:25:04.000000000","message":"time","commit_id":"d13b87b8483ddd63ad7bcc16e584b644dc7f4767"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b6dd84a922c0d6a88e0b0659b51dc42d5c98814e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Keep history of updated resource attributes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change keeps history of updated resource attributes"},{"line_number":10,"context_line":"by creating a new row in resource_history tables each times the"},{"line_number":11,"context_line":"resource table is updated."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Each resource extension table also gain a \u0027\u003cresource_name\u003e_history\u0027 to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9aa53dc9_81c67f47","line":10,"in_reply_to":"9aa53dc9_a6b19991","updated":"2015-04-08 10:34:33.000000000","message":"Done","commit_id":"d13b87b8483ddd63ad7bcc16e584b644dc7f4767"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a7342a257980a861afa04beb5b02b3fdc67884f4","unresolved":false,"context_lines":[{"line_number":10,"context_line":"by creating a new row in resource_history tables each times the"},{"line_number":11,"context_line":"resource table is updated."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Each resource extension table also gain a \u0027\u003cresource_name\u003e_history\u0027 to"},{"line_number":14,"context_line":"track their history too."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: If532b5167f0bbecb94f15594f0227c537ed26f77"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9aa53dc9_86ac5536","line":13,"updated":"2015-04-08 10:25:04.000000000","message":"gains","commit_id":"d13b87b8483ddd63ad7bcc16e584b644dc7f4767"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b6dd84a922c0d6a88e0b0659b51dc42d5c98814e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"by creating a new row in resource_history tables each times the"},{"line_number":11,"context_line":"resource table is updated."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Each resource extension table also gain a \u0027\u003cresource_name\u003e_history\u0027 to"},{"line_number":14,"context_line":"track their history too."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: If532b5167f0bbecb94f15594f0227c537ed26f77"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9aa53dc9_61c5bb3a","line":13,"in_reply_to":"9aa53dc9_86ac5536","updated":"2015-04-08 10:34:33.000000000","message":"Done","commit_id":"d13b87b8483ddd63ad7bcc16e584b644dc7f4767"}],"doc/source/rest.j2":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"fac751f6761cf17ab208ecf21ec0a1076efcdb2c","unresolved":false,"context_lines":[{"line_number":239,"context_line":""},{"line_number":240,"context_line":"{{ scenarios[\u0027search-resource-for-user-details\u0027][\u0027doc\u0027] }}"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"It\u0027s possible to search for old version of resources in the same ways:"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"{{ scenarios[\u0027search-resource-history\u0027][\u0027doc\u0027] }}"},{"line_number":245,"context_line":""}],"source_content_type":"text/x-jinja2","patch_set":24,"id":"9aa53dc9_3a01ba05","line":242,"updated":"2015-04-10 11:40:25.000000000","message":"versions?","commit_id":"087546e7c7ea0a975a8740c28a60edc85d3d9b8c"}],"gnocchi/indexer/sqlalchemy.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b2d43e96e18e157b30150944ab91a9e146563995","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            # AND allow to \"patch\" a resource, we have to be able to"},{"line_number":177,"context_line":"            # duplicate a row and then update this duplicate in an atomic maner"},{"line_number":178,"context_line":"            # To do that in update_resource use \"insert from select\" scheme"},{"line_number":179,"context_line":"            # but to identity the latest revision of the attributes of the"},{"line_number":180,"context_line":"            # extra resource table, we have to put the id into this table too."},{"line_number":181,"context_line":"            kwargs[\u0027eid\u0027] \u003d resource_id"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baa041b7_d4e6dce7","line":179,"updated":"2015-04-01 18:27:29.000000000","message":"s/identity/identify/","commit_id":"872f17af9b5cb605587b3a1b26d527ddc3a4a9f6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"07c07b2630dc13a388462fdd9c1a7edabef2a3fd","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            for col in sqlalchemy.inspect(resource_cls).columns:"},{"line_number":238,"context_line":"                setattr(rh, col.name, getattr(r, col.name))"},{"line_number":239,"context_line":"            rh.lifetime_to \u003d now"},{"line_number":240,"context_line":"            session.add(rh)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"            # Update the resource"},{"line_number":243,"context_line":"            if ended_at is not _marker:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_c41a8b17","line":240,"updated":"2015-04-07 10:05:01.000000000","message":"This looks like a SELECT + INSERT, not an INSERT FROM SELECT?","commit_id":"c6beb889fd86086b19a5777dcfe883fe91f518c9"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b741dbcc111d59f673131fc52327218bfd979d8d","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            for col in sqlalchemy.inspect(resource_cls).columns:"},{"line_number":238,"context_line":"                setattr(rh, col.name, getattr(r, col.name))"},{"line_number":239,"context_line":"            rh.lifetime_to \u003d now"},{"line_number":240,"context_line":"            session.add(rh)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"            # Update the resource"},{"line_number":243,"context_line":"            if ended_at is not _marker:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_fa3f6423","line":240,"in_reply_to":"9aa53dc9_c41a8b17","updated":"2015-04-07 10:55:43.000000000","message":"Using SELECT + INSERT or INSERT FROM SELECT have the same result here, Because we have does a \u0027select\u0027  for updating the resource too and DBMS make the necessary protection for us by raising deadlock (or creating a lock in my next patch).","commit_id":"c6beb889fd86086b19a5777dcfe883fe91f518c9"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"07c07b2630dc13a388462fdd9c1a7edabef2a3fd","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            try:"},{"line_number":275,"context_line":"                session.flush()"},{"line_number":276,"context_line":"            except exception.DBDeadlock:"},{"line_number":277,"context_line":"                # TODO(sileht): retry ourself"},{"line_number":278,"context_line":"                raise ValueError("},{"line_number":279,"context_line":"                    \"The resource have been updated in the meantime, \""},{"line_number":280,"context_line":"                    \"please retry...\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_a49c276a","line":277,"updated":"2015-04-07 10:05:01.000000000","message":"You can use @retrying, we already depends on it. I wonder if oslo.db does not provide a retry mechanism too for that now.","commit_id":"c6beb889fd86086b19a5777dcfe883fe91f518c9"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b741dbcc111d59f673131fc52327218bfd979d8d","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            try:"},{"line_number":275,"context_line":"                session.flush()"},{"line_number":276,"context_line":"            except exception.DBDeadlock:"},{"line_number":277,"context_line":"                # TODO(sileht): retry ourself"},{"line_number":278,"context_line":"                raise ValueError("},{"line_number":279,"context_line":"                    \"The resource have been updated in the meantime, \""},{"line_number":280,"context_line":"                    \"please retry...\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_faa3e49c","line":277,"in_reply_to":"9aa53dc9_a49c276a","updated":"2015-04-07 10:55:43.000000000","message":"In next patch I have added \u0027with_for_update()\u0027 on the resource query to avoid mysql/postgresql to raise deadlock exception.","commit_id":"c6beb889fd86086b19a5777dcfe883fe91f518c9"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"de6a6ae888ae69a132548cc58e1a9b46a6228e51","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        with session.begin():"},{"line_number":208,"context_line":"            # NOTE(sileht): We use FOR UPDATE that is not galera friendly,"},{"line_number":209,"context_line":"            # but they are no other way to cleanly patch a resource and store"},{"line_number":210,"context_line":"            # the history that safe when two concurrents call are done."},{"line_number":211,"context_line":"            q \u003d session.query(resource_cls).filter("},{"line_number":212,"context_line":"                resource_cls.id \u003d\u003d resource_id).with_for_update()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_9e47ff76","line":210,"updated":"2015-04-08 08:18:51.000000000","message":"concurrent calls","commit_id":"0c361440cdba259b367c089c1803263ca5c022f0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"97726e40c3c57ea4457c7d03b3b6c6236175ccb7","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        with session.begin():"},{"line_number":208,"context_line":"            # NOTE(sileht): We use FOR UPDATE that is not galera friendly,"},{"line_number":209,"context_line":"            # but they are no other way to cleanly patch a resource and store"},{"line_number":210,"context_line":"            # the history that safe when two concurrents call are done."},{"line_number":211,"context_line":"            q \u003d session.query(resource_cls).filter("},{"line_number":212,"context_line":"                resource_cls.id \u003d\u003d resource_id).with_for_update()"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_e85ad082","line":210,"in_reply_to":"9aa53dc9_9e47ff76","updated":"2015-04-08 09:31:09.000000000","message":"Done","commit_id":"0c361440cdba259b367c089c1803263ca5c022f0"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"de6a6ae888ae69a132548cc58e1a9b46a6228e51","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            # NOTE(jd) Always load metrics. It\u0027s sad, but since anyway what we"},{"line_number":215,"context_line":"            # return will end up on the wire, the user wants full info, so"},{"line_number":216,"context_line":"            # don\u0027t bother providing a with_metrics parameter."},{"line_number":217,"context_line":"            # NOTE(sileht): joinedload is not possible with \u0027FOR UPDATE\u0027"},{"line_number":218,"context_line":"            # q \u003d q.options(sqlalchemy.orm.joinedload(resource_cls.metrics))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"            r \u003d q.first()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_5e2177b3","line":217,"updated":"2015-04-08 08:18:51.000000000","message":"You can just delete those lines I guess then.","commit_id":"0c361440cdba259b367c089c1803263ca5c022f0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"97726e40c3c57ea4457c7d03b3b6c6236175ccb7","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            # NOTE(jd) Always load metrics. It\u0027s sad, but since anyway what we"},{"line_number":215,"context_line":"            # return will end up on the wire, the user wants full info, so"},{"line_number":216,"context_line":"            # don\u0027t bother providing a with_metrics parameter."},{"line_number":217,"context_line":"            # NOTE(sileht): joinedload is not possible with \u0027FOR UPDATE\u0027"},{"line_number":218,"context_line":"            # q \u003d q.options(sqlalchemy.orm.joinedload(resource_cls.metrics))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"            r \u003d q.first()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_0864d446","line":217,"in_reply_to":"9aa53dc9_5e2177b3","updated":"2015-04-08 09:31:09.000000000","message":"Done","commit_id":"0c361440cdba259b367c089c1803263ca5c022f0"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"de6a6ae888ae69a132548cc58e1a9b46a6228e51","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                            {\"resource_id\": None})"},{"line_number":258,"context_line":"                self._set_metrics_for_resource(session, r, metrics)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        # NOTE(jd) Force reload of metrics – do it outside the session!"},{"line_number":261,"context_line":"        r.metrics"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        return r"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_5e08572d","line":260,"updated":"2015-04-08 08:18:51.000000000","message":"s/reload/load/","commit_id":"0c361440cdba259b367c089c1803263ca5c022f0"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"97726e40c3c57ea4457c7d03b3b6c6236175ccb7","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                            {\"resource_id\": None})"},{"line_number":258,"context_line":"                self._set_metrics_for_resource(session, r, metrics)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        # NOTE(jd) Force reload of metrics – do it outside the session!"},{"line_number":261,"context_line":"        r.metrics"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        return r"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa53dc9_c85dcc7a","line":260,"in_reply_to":"9aa53dc9_5e08572d","updated":"2015-04-08 09:31:09.000000000","message":"Done","commit_id":"0c361440cdba259b367c089c1803263ca5c022f0"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"a7342a257980a861afa04beb5b02b3fdc67884f4","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                            {\"resource_id\": None})"},{"line_number":218,"context_line":"                self._set_metrics_for_resource(session, r, metrics)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        if metrics is not _marker:"},{"line_number":221,"context_line":"            # NOTE(jd) Force reload of metrics – do it outside the session!"},{"line_number":222,"context_line":"            r.metrics"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_810f9f2d","side":"PARENT","line":220,"updated":"2015-04-08 10:25:04.000000000","message":"Is it okay to be losing the _marker guard here?","commit_id":"1da188433d3a8cc50064f710e4f8f57ad5433f5f"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b6dd84a922c0d6a88e0b0659b51dc42d5c98814e","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                            {\"resource_id\": None})"},{"line_number":218,"context_line":"                self._set_metrics_for_resource(session, r, metrics)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        if metrics is not _marker:"},{"line_number":221,"context_line":"            # NOTE(jd) Force reload of metrics – do it outside the session!"},{"line_number":222,"context_line":"            r.metrics"},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_819f9f4f","side":"PARENT","line":220,"in_reply_to":"9aa53dc9_810f9f2d","updated":"2015-04-08 10:34:33.000000000","message":"Yes, because we can\u0027t load anymore the metrics with the query L211, so we need to load them here, in all cases.","commit_id":"1da188433d3a8cc50064f710e4f8f57ad5433f5f"}],"gnocchi/indexer/sqlalchemy_base.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c5f0bc6e0bd51c20a05a34dcf27a0490f47497be","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                                 # without that mysql write 1 if"},{"line_number":148,"context_line":"                                 # the orm object set revision to 0"},{"line_number":149,"context_line":"                                 server_default\u003d\"0\","},{"line_number":150,"context_line":"                                 nullable\u003dFalse)"},{"line_number":151,"context_line":"    last_revision \u003d sqlalchemy.Column(sqlalchemy.Boolean, default\u003dTrue)"},{"line_number":152,"context_line":"    type \u003d sqlalchemy.Column(sqlalchemy.Enum(\u0027metric\u0027, \u0027generic\u0027, \u0027instance\u0027,"},{"line_number":153,"context_line":"                                             \u0027swift_account\u0027, \u0027volume\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa963961_407ad825","line":150,"updated":"2015-03-27 16:40:38.000000000","message":"Isn\u0027t there a way to use auto increment here? We don\u0027t even care that the increment is global and not per object in the end.","commit_id":"e24d0b26c5b2a20d57a1d8c626e76d1bf9f1df1a"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f8a7b82aee1a318c152d4389d5a728626b92970d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                                 # without that mysql write 1 if"},{"line_number":148,"context_line":"                                 # the orm object set revision to 0"},{"line_number":149,"context_line":"                                 server_default\u003d\"0\","},{"line_number":150,"context_line":"                                 nullable\u003dFalse)"},{"line_number":151,"context_line":"    last_revision \u003d sqlalchemy.Column(sqlalchemy.Boolean, default\u003dTrue)"},{"line_number":152,"context_line":"    type \u003d sqlalchemy.Column(sqlalchemy.Enum(\u0027metric\u0027, \u0027generic\u0027, \u0027instance\u0027,"},{"line_number":153,"context_line":"                                             \u0027swift_account\u0027, \u0027volume\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_dd95c840","line":150,"in_reply_to":"da9b358b_ec2580c2","updated":"2015-03-30 09:35:32.000000000","message":"You can use autoincrement\u003dTrue to have an autoincrement number. That should do it.","commit_id":"e24d0b26c5b2a20d57a1d8c626e76d1bf9f1df1a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ecdea9ced73ddf04334b3a828734a31897033929","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                                 # without that mysql write 1 if"},{"line_number":148,"context_line":"                                 # the orm object set revision to 0"},{"line_number":149,"context_line":"                                 server_default\u003d\"0\","},{"line_number":150,"context_line":"                                 nullable\u003dFalse)"},{"line_number":151,"context_line":"    last_revision \u003d sqlalchemy.Column(sqlalchemy.Boolean, default\u003dTrue)"},{"line_number":152,"context_line":"    type \u003d sqlalchemy.Column(sqlalchemy.Enum(\u0027metric\u0027, \u0027generic\u0027, \u0027instance\u0027,"},{"line_number":153,"context_line":"                                             \u0027swift_account\u0027, \u0027volume\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_ec2580c2","line":150,"in_reply_to":"fa963961_407ad825","updated":"2015-03-30 08:27:34.000000000","message":"I have not found a schema that permit to use auto increment. Because I have not found how we sqlachemy to make atomic, \"copy last resource row and re-insert it with some column updated\".\n\nSo for now, this is done in two sql requests, and because updating resource can occurs concurrently, the follow occurs:\n\n  API call 1: select last row\n  API call 2: select last row\n  API call 1: insert this row with some column updated\n  API call 2: insert this row with some column updated # \u003c-- attributes updated by call 1 are lost here.\n\nSo to avoid this issue, I have set the couple resource_id/revision as primary key and increment the revision manually, so if that issue occurs, both call will use the same revision, DBDuplicateEntry is raised, user have to retry. That less perfect than a atomic sql request.","commit_id":"e24d0b26c5b2a20d57a1d8c626e76d1bf9f1df1a"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c5f0bc6e0bd51c20a05a34dcf27a0490f47497be","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                 # the orm object set revision to 0"},{"line_number":149,"context_line":"                                 server_default\u003d\"0\","},{"line_number":150,"context_line":"                                 nullable\u003dFalse)"},{"line_number":151,"context_line":"    last_revision \u003d sqlalchemy.Column(sqlalchemy.Boolean, default\u003dTrue)"},{"line_number":152,"context_line":"    type \u003d sqlalchemy.Column(sqlalchemy.Enum(\u0027metric\u0027, \u0027generic\u0027, \u0027instance\u0027,"},{"line_number":153,"context_line":"                                             \u0027swift_account\u0027, \u0027volume\u0027,"},{"line_number":154,"context_line":"                                             \u0027ceph_account\u0027, \u0027network\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa963961_809ea054","line":151,"updated":"2015-03-27 16:40:38.000000000","message":"it\u0027s MAX(revision) anyway?","commit_id":"e24d0b26c5b2a20d57a1d8c626e76d1bf9f1df1a"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f8a7b82aee1a318c152d4389d5a728626b92970d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                 # the orm object set revision to 0"},{"line_number":149,"context_line":"                                 server_default\u003d\"0\","},{"line_number":150,"context_line":"                                 nullable\u003dFalse)"},{"line_number":151,"context_line":"    last_revision \u003d sqlalchemy.Column(sqlalchemy.Boolean, default\u003dTrue)"},{"line_number":152,"context_line":"    type \u003d sqlalchemy.Column(sqlalchemy.Enum(\u0027metric\u0027, \u0027generic\u0027, \u0027instance\u0027,"},{"line_number":153,"context_line":"                                             \u0027swift_account\u0027, \u0027volume\u0027,"},{"line_number":154,"context_line":"                                             \u0027ceph_account\u0027, \u0027network\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_3d8dd431","line":151,"in_reply_to":"da9b358b_a762f3d6","updated":"2015-03-30 09:35:32.000000000","message":"GROUP BY (id) ?","commit_id":"e24d0b26c5b2a20d57a1d8c626e76d1bf9f1df1a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ecdea9ced73ddf04334b3a828734a31897033929","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                                 # the orm object set revision to 0"},{"line_number":149,"context_line":"                                 server_default\u003d\"0\","},{"line_number":150,"context_line":"                                 nullable\u003dFalse)"},{"line_number":151,"context_line":"    last_revision \u003d sqlalchemy.Column(sqlalchemy.Boolean, default\u003dTrue)"},{"line_number":152,"context_line":"    type \u003d sqlalchemy.Column(sqlalchemy.Enum(\u0027metric\u0027, \u0027generic\u0027, \u0027instance\u0027,"},{"line_number":153,"context_line":"                                             \u0027swift_account\u0027, \u0027volume\u0027,"},{"line_number":154,"context_line":"                                             \u0027ceph_account\u0027, \u0027network\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da9b358b_a762f3d6","line":151,"in_reply_to":"fa963961_809ea054","updated":"2015-03-30 08:27:34.000000000","message":"When we list resources this become the MAX(revision) of each resource. I have not found yet the sqlalchemy magic to make the sql join I want that doesn\u0027t break the QueryTransformer.","commit_id":"e24d0b26c5b2a20d57a1d8c626e76d1bf9f1df1a"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"b2d43e96e18e157b30150944ab91a9e146563995","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        COMMON_TABLES_ARGS,"},{"line_number":150,"context_line":"    )"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    seq \u003d sqlalchemy.Column(sqlalchemy.Integer, primary_key\u003dTrue,"},{"line_number":153,"context_line":"                            autoincrement\u003dTrue)"},{"line_number":154,"context_line":"    id \u003d sqlalchemy.Column(sqlalchemy_utils.UUIDType(binary\u003dFalse),"},{"line_number":155,"context_line":"                           sqlalchemy.ForeignKey(\u0027resourceid.id\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"baa041b7_34ef48b2","line":152,"updated":"2015-04-01 18:27:29.000000000","message":"seq? revision might be better now?","commit_id":"872f17af9b5cb605587b3a1b26d527ddc3a4a9f6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"07c07b2630dc13a388462fdd9c1a7edabef2a3fd","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"class ResourceExt(object):"},{"line_number":233,"context_line":"    # Default extension class for plugin that doesn\u0027t need additional"},{"line_number":234,"context_line":"    # columns"},{"line_number":235,"context_line":"    pass"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_44fe7b6c","line":233,"updated":"2015-04-07 10:05:01.000000000","message":"Docstring?","commit_id":"c6beb889fd86086b19a5777dcfe883fe91f518c9"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b741dbcc111d59f673131fc52327218bfd979d8d","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"class ResourceExt(object):"},{"line_number":233,"context_line":"    # Default extension class for plugin that doesn\u0027t need additional"},{"line_number":234,"context_line":"    # columns"},{"line_number":235,"context_line":"    pass"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9aa53dc9_3aca6ca2","line":233,"in_reply_to":"9aa53dc9_44fe7b6c","updated":"2015-04-07 10:55:43.000000000","message":"Done","commit_id":"c6beb889fd86086b19a5777dcfe883fe91f518c9"}],"gnocchi/tests/gabbi/gabbits/history.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4f6c0ec7338c5dc408164fa5987fcc284b256725","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Test the resource API to achieve coverage of just the"},{"line_number":3,"context_line":"# ResourcesController and ResourceController class code."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"fixtures:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"9aa53dc9_a75adc81","line":3,"updated":"2015-04-07 15:02:51.000000000","message":"Not relevant here.","commit_id":"7fadb74e410d7428f03be1322cd6bcc852171a4a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"326204164b2efa8ba89dae56c987d3d798acf6c6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Test the resource API to achieve coverage of just the"},{"line_number":3,"context_line":"# ResourcesController and ResourceController class code."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"fixtures:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"9aa53dc9_3d947de0","line":3,"in_reply_to":"9aa53dc9_a75adc81","updated":"2015-04-08 09:31:02.000000000","message":"Done","commit_id":"7fadb74e410d7428f03be1322cd6bcc852171a4a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"4f6c0ec7338c5dc408164fa5987fcc284b256725","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# here. This could be done in a fixture but since the API allows it"},{"line_number":13,"context_line":"# may as well use it."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - name: create archive policy"},{"line_number":16,"context_line":"      desc: for later use"},{"line_number":17,"context_line":"      url: /v1/archive_policy"},{"line_number":18,"context_line":"      method: POST"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"9aa53dc9_27780cf2","line":15,"updated":"2015-04-07 15:02:51.000000000","message":"Can remove this for this particular test?","commit_id":"7fadb74e410d7428f03be1322cd6bcc852171a4a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"326204164b2efa8ba89dae56c987d3d798acf6c6","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# here. This could be done in a fixture but since the API allows it"},{"line_number":13,"context_line":"# may as well use it."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"    - name: create archive policy"},{"line_number":16,"context_line":"      desc: for later use"},{"line_number":17,"context_line":"      url: /v1/archive_policy"},{"line_number":18,"context_line":"      method: POST"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"9aa53dc9_fdbcd56d","line":15,"in_reply_to":"9aa53dc9_27780cf2","updated":"2015-04-08 09:31:02.000000000","message":"Done","commit_id":"7fadb74e410d7428f03be1322cd6bcc852171a4a"}],"gnocchi/tests/test_rest.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"dda016f2f1c305668e2da67f12c43856ca243d36","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"        self.assertEqual(\"http://localhost/v1/resource/\""},{"line_number":1272,"context_line":"                         + self.resource_type + \"/\" + self.attributes[\u0027id\u0027],"},{"line_number":1273,"context_line":"                         result.headers[\u0027Location\u0027])"},{"line_number":1274,"context_line":"        del resource[\u0027lifetime_from\u0027]"},{"line_number":1275,"context_line":"        del resource[\u0027lifetime_to\u0027]"},{"line_number":1276,"context_line":"        self.assertEqual(self.resource, resource)"},{"line_number":1277,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9aa53dc9_17d4ed1d","line":1274,"updated":"2015-04-08 11:22:20.000000000","message":"I think you don\u0027t check at least one this. It\u0027d be good.\n\nYou can mock timeutils.utcnow() and use it in sqlalchemy to do so. :)","commit_id":"60432bbe09326b8ed968854fcf06f1188e6d7742"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"b0cd8088eebcf86b306bf6685b5d65c031cf3f5d","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"        self.assertEqual(\"http://localhost/v1/resource/\""},{"line_number":1272,"context_line":"                         + self.resource_type + \"/\" + self.attributes[\u0027id\u0027],"},{"line_number":1273,"context_line":"                         result.headers[\u0027Location\u0027])"},{"line_number":1274,"context_line":"        del resource[\u0027lifetime_from\u0027]"},{"line_number":1275,"context_line":"        del resource[\u0027lifetime_to\u0027]"},{"line_number":1276,"context_line":"        self.assertEqual(self.resource, resource)"},{"line_number":1277,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9aa53dc9_f373dc13","line":1274,"in_reply_to":"9aa53dc9_17d4ed1d","updated":"2015-04-08 12:01:05.000000000","message":"Done","commit_id":"60432bbe09326b8ed968854fcf06f1188e6d7742"}]}
