)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"15e7a5ef57221f11361b001b71b0cff1ab1d533d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Chris Behrens \u003ccbehrens@codestud.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-03-11 16:28:29 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Force resource updates to update updated_at"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When there\u0027s no changes in resources, compute_node_update (and other"},{"line_number":10,"context_line":"DB update calls) won\u0027t modify \u0027updated_at\u0027."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAN3%2F%2FzeM%3D","line":7,"updated":"2013-03-12 00:11:58.000000000","message":"Missing .","commit_id":"f398b9e195cda582bad57396b097dec274384c07"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"3f69e56bc362d96c903afd8dee58c0aba25234db","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Chris Behrens \u003ccbehrens@codestud.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-03-11 16:28:29 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Force resource updates to update updated_at"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When there\u0027s no changes in resources, compute_node_update (and other"},{"line_number":10,"context_line":"DB update calls) won\u0027t modify \u0027updated_at\u0027."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAN3%2F%2FzP8%3D","line":7,"in_reply_to":"AAAAN3%2F%2FzeM%3D","updated":"2013-03-12 03:14:05.000000000","message":"That\u0027s extremely nit-picky!","commit_id":"f398b9e195cda582bad57396b097dec274384c07"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"15e7a5ef57221f11361b001b71b0cff1ab1d533d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"By always updating \u0027updated_at\u0027 on resource updates, the periodic task"},{"line_number":18,"context_line":"will be sure to invalidate any bad cache the scheduler has."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Fixes bug 1153778"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I19b51a5b84f472cd0f4de6460a4edb540cc62da2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAN3%2F%2FzaI%3D","line":20,"updated":"2013-03-12 00:11:58.000000000","message":"The bug describes both one solution and the problem.I\u0027m a little worried that this approach will cause unreasonable load in large (1000\u0027s of nodes) environments.","commit_id":"f398b9e195cda582bad57396b097dec274384c07"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"3f69e56bc362d96c903afd8dee58c0aba25234db","unresolved":false,"context_lines":[{"line_number":17,"context_line":"By always updating \u0027updated_at\u0027 on resource updates, the periodic task"},{"line_number":18,"context_line":"will be sure to invalidate any bad cache the scheduler has."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Fixes bug 1153778"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I19b51a5b84f472cd0f4de6460a4edb540cc62da2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAN3%2F%2FzQM%3D","line":20,"in_reply_to":"AAAAN3%2F%2FzaI%3D","updated":"2013-03-12 03:14:05.000000000","message":"Ok, I removed the bug fix implementation details from the bug report itself.","commit_id":"f398b9e195cda582bad57396b097dec274384c07"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"15e7a5ef57221f11361b001b71b0cff1ab1d533d","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        # changes in data.  This ensures that we invalidate the"},{"line_number":535,"context_line":"        # scheduler cache of compute node data in case of races."},{"line_number":536,"context_line":"        if \u0027updated_at\u0027 not in values:"},{"line_number":537,"context_line":"            values[\u0027updated_at\u0027] \u003d timeutils.utcnow()"},{"line_number":538,"context_line":"        convert_datetimes(values, \u0027created_at\u0027, \u0027deleted_at\u0027, \u0027updated_at\u0027)"},{"line_number":539,"context_line":"        compute_ref.update(values)"},{"line_number":540,"context_line":"    return compute_ref"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FzaA%3D","line":537,"updated":"2013-03-12 00:11:58.000000000","message":"It also forces the cache to rebuild every time, and this will scale work linearly with nodes. That seems undesirable - why do we have an updated_at hint at all?","commit_id":"f398b9e195cda582bad57396b097dec274384c07"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"3f69e56bc362d96c903afd8dee58c0aba25234db","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        # changes in data.  This ensures that we invalidate the"},{"line_number":535,"context_line":"        # scheduler cache of compute node data in case of races."},{"line_number":536,"context_line":"        if \u0027updated_at\u0027 not in values:"},{"line_number":537,"context_line":"            values[\u0027updated_at\u0027] \u003d timeutils.utcnow()"},{"line_number":538,"context_line":"        convert_datetimes(values, \u0027created_at\u0027, \u0027deleted_at\u0027, \u0027updated_at\u0027)"},{"line_number":539,"context_line":"        compute_ref.update(values)"},{"line_number":540,"context_line":"    return compute_ref"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FzQA%3D","line":537,"in_reply_to":"AAAAN3%2F%2FzaA%3D","updated":"2013-03-12 03:14:05.000000000","message":"Which cache?   The scheduler cache?   The scheduler already grabs all compute node entries on every build.  This really doesn\u0027t cause it to do any more work.  And the idea behind the scheduler cache was to solve race conditions in builds, anyway, when it\u0027s selecting hosts but the resources have not been assigned to hosts.  It wasn\u0027t there for performance reasons.","commit_id":"f398b9e195cda582bad57396b097dec274384c07"}],"nova/tests/test_db_api.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"15e7a5ef57221f11361b001b71b0cff1ab1d533d","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"},{"line_number":1516,"context_line":"        item_updated \u003d db.compute_node_update(self.ctxt,"},{"line_number":1517,"context_line":"                item[\u0027id\u0027], {})"},{"line_number":1518,"context_line":"        self.assertNotEqual(item[\u0027updated_at\u0027], item_updated[\u0027updated_at\u0027])"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"    def test_compute_node_stat_prune(self):"},{"line_number":1521,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FzZ8%3D","line":1518,"updated":"2013-03-12 00:11:58.000000000","message":"I think you probably want a LessThan inequality here, vs just NotEqual (because None would pass your test, but fail your intent)","commit_id":"f398b9e195cda582bad57396b097dec274384c07"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"5245f24c49910ab9498a6f033b74d229e7b998b3","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"},{"line_number":1516,"context_line":"        item_updated \u003d db.compute_node_update(self.ctxt,"},{"line_number":1517,"context_line":"                item[\u0027id\u0027], {})"},{"line_number":1518,"context_line":"        self.assertNotEqual(item[\u0027updated_at\u0027], item_updated[\u0027updated_at\u0027])"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"    def test_compute_node_stat_prune(self):"},{"line_number":1521,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FzPg%3D","line":1518,"in_reply_to":"AAAAN3%2F%2FzPw%3D","updated":"2013-03-12 03:27:51.000000000","message":"Yea.  I think it\u0027s fine.  If the time goes backwards, something would be extremely messed up.","commit_id":"f398b9e195cda582bad57396b097dec274384c07"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"7ce8d0a512a1e43bcb38f873b64a1440b6c8e5c0","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"},{"line_number":1516,"context_line":"        item_updated \u003d db.compute_node_update(self.ctxt,"},{"line_number":1517,"context_line":"                item[\u0027id\u0027], {})"},{"line_number":1518,"context_line":"        self.assertNotEqual(item[\u0027updated_at\u0027], item_updated[\u0027updated_at\u0027])"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"    def test_compute_node_stat_prune(self):"},{"line_number":1521,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FzPw%3D","line":1518,"in_reply_to":"AAAAN3%2F%2FzQI%3D","updated":"2013-03-12 03:20:34.000000000","message":"It is up to you, I only noted the issue because I presume you don\u0027t want to see a regression occur in future.","commit_id":"f398b9e195cda582bad57396b097dec274384c07"},{"author":{"_account_id":1030,"name":"Chris Behrens","email":"cbehrens@codestud.com","username":"cbehrens"},"change_message_id":"3f69e56bc362d96c903afd8dee58c0aba25234db","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"},{"line_number":1516,"context_line":"        item_updated \u003d db.compute_node_update(self.ctxt,"},{"line_number":1517,"context_line":"                item[\u0027id\u0027], {})"},{"line_number":1518,"context_line":"        self.assertNotEqual(item[\u0027updated_at\u0027], item_updated[\u0027updated_at\u0027])"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"    def test_compute_node_stat_prune(self):"},{"line_number":1521,"context_line":"        item \u003d self._create_helper(\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FzQI%3D","line":1518,"in_reply_to":"AAAAN3%2F%2FzZ8%3D","updated":"2013-03-12 03:14:05.000000000","message":"The test fails before as None \u003d\u003d None before my patch.  It passes now because None !\u003d \u003ccurrent time\u003e.  I didn\u0027t feel the need to complicate the test code any further by setting some sort of fake time in the past and comparing that updated_at has a newer time now when this test suffices.  But if one really wants that.. okay.","commit_id":"f398b9e195cda582bad57396b097dec274384c07"}]}
