)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"bc46d8f16f7b28c51101c88776c7d8a7bed9d456","unresolved":false,"context_lines":[{"line_number":15,"context_line":"magnitued. Preliminary tests have shown up to 100 times improvement in"},{"line_number":16,"context_line":"host state acquisition over standard DB-based state storage for large scale"},{"line_number":17,"context_line":"(up to 10k nodes) clouds."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I438b31d5e66745278e3bfc17d6e0aa6f81a6616b"},{"line_number":20,"context_line":"BP: no-db-scheduler"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":38,"id":"AAAAT3%2F%2F1p8%3D","line":18,"updated":"2013-12-30 12:32:36.000000000","message":"Please add DocImpact - this is due to the fact that we have new configuration variables. It would be nice if you write these in the commit message too","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":15,"context_line":"magnitued. Preliminary tests have shown up to 100 times improvement in"},{"line_number":16,"context_line":"host state acquisition over standard DB-based state storage for large scale"},{"line_number":17,"context_line":"(up to 10k nodes) clouds."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I438b31d5e66745278e3bfc17d6e0aa6f81a6616b"},{"line_number":20,"context_line":"BP: no-db-scheduler"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":38,"id":"AAAAUH%2F%2FtNE%3D","line":18,"in_reply_to":"AAAAT3%2F%2F1p8%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"}],"doc/api_samples/os-hypervisors/hypervisors-show-resp.json":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a1e51680d18006ff92e82682c38724dca8831de6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"        \"running_vms\": 0,"},{"line_number":17,"context_line":"        \"service\": {"},{"line_number":18,"context_line":"            \"host\": \"5641188ab2964f88a21042b493585ff8\","},{"line_number":19,"context_line":"            \"id\": 3"},{"line_number":20,"context_line":"        },"},{"line_number":21,"context_line":"        \"vcpus\": 1,"},{"line_number":22,"context_line":"        \"vcpus_used\": 0"}],"source_content_type":"application/json","patch_set":7,"id":"AAAATn%2F%2FS2Y%3D","line":19,"updated":"2013-11-11 14:35:47.000000000","message":"why does this need to be changed? is this related to this patch set?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b49976acd6bf15f278962de9dae386f65f01d9c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"        \"running_vms\": 0,"},{"line_number":17,"context_line":"        \"service\": {"},{"line_number":18,"context_line":"            \"host\": \"5641188ab2964f88a21042b493585ff8\","},{"line_number":19,"context_line":"            \"id\": 3"},{"line_number":20,"context_line":"        },"},{"line_number":21,"context_line":"        \"vcpus\": 1,"},{"line_number":22,"context_line":"        \"vcpus_used\": 0"}],"source_content_type":"application/json","patch_set":7,"id":"AAAATn%2F%2FS1E%3D","line":19,"in_reply_to":"AAAATn%2F%2FS2Y%3D","updated":"2013-11-11 14:42:57.000000000","message":"Yes. Long story short it makes tox happier.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"doc/api_samples/os-hypervisors/hypervisors-show-resp.xml":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a1e51680d18006ff92e82682c38724dca8831de6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e"},{"line_number":2,"context_line":"\u003chypervisor vcpus_used\u003d\"0\" hypervisor_type\u003d\"fake\" local_gb_used\u003d\"0\" hypervisor_hostname\u003d\"fake-mini\" memory_mb_used\u003d\"512\" memory_mb\u003d\"8192\" current_workload\u003d\"0\" vcpus\u003d\"1\" cpu_info\u003d\"?\" running_vms\u003d\"0\" free_disk_gb\u003d\"1028\" hypervisor_version\u003d\"1\" disk_available_least\u003d\"0\" local_gb\u003d\"1028\" free_ram_mb\u003d\"7680\" id\u003d\"1\"\u003e"},{"line_number":3,"context_line":"  \u003cservice host\u003d\"807e1a43ceb740138eea32969c3e9fe5\" id\u003d\"3\"/\u003e"},{"line_number":4,"context_line":"\u003c/hypervisor\u003e"}],"source_content_type":"application/xml","patch_set":7,"id":"AAAATn%2F%2FS2I%3D","line":3,"updated":"2013-11-11 14:35:47.000000000","message":"same question - is this related to the patch set?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b49976acd6bf15f278962de9dae386f65f01d9c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e"},{"line_number":2,"context_line":"\u003chypervisor vcpus_used\u003d\"0\" hypervisor_type\u003d\"fake\" local_gb_used\u003d\"0\" hypervisor_hostname\u003d\"fake-mini\" memory_mb_used\u003d\"512\" memory_mb\u003d\"8192\" current_workload\u003d\"0\" vcpus\u003d\"1\" cpu_info\u003d\"?\" running_vms\u003d\"0\" free_disk_gb\u003d\"1028\" hypervisor_version\u003d\"1\" disk_available_least\u003d\"0\" local_gb\u003d\"1028\" free_ram_mb\u003d\"7680\" id\u003d\"1\"\u003e"},{"line_number":3,"context_line":"  \u003cservice host\u003d\"807e1a43ceb740138eea32969c3e9fe5\" id\u003d\"3\"/\u003e"},{"line_number":4,"context_line":"\u003c/hypervisor\u003e"}],"source_content_type":"application/xml","patch_set":7,"id":"AAAATn%2F%2FS0w%3D","line":3,"in_reply_to":"AAAATn%2F%2FS2I%3D","updated":"2013-11-11 14:42:57.000000000","message":"Yes, for the same reson as in .json.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"etc/nova/nova.conf.sample":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":1833,"context_line":"#"},{"line_number":1834,"context_line":""},{"line_number":1835,"context_line":"# Default backend class. (string value)"},{"line_number":1836,"context_line":"#storage_backend\u003dnova.scheduler.vault_backends.mysql.MySQL_Synchronizer"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":"# Default namespace to use. (string value)"},{"line_number":1839,"context_line":"#default_namespace\u003dnova"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91wU%3D","line":1836,"updated":"2013-12-05 11:33:35.000000000","message":"why is this vault? maybe storage, cache or collector are names worth considering","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":1833,"context_line":"#"},{"line_number":1834,"context_line":""},{"line_number":1835,"context_line":"# Default backend class. (string value)"},{"line_number":1836,"context_line":"#storage_backend\u003dnova.scheduler.vault_backends.mysql.MySQL_Synchronizer"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":"# Default namespace to use. (string value)"},{"line_number":1839,"context_line":"#default_namespace\u003dnova"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91Ww%3D","line":1836,"in_reply_to":"AAAATn%2F91wU%3D","updated":"2013-12-05 13:24:23.000000000","message":"Because vault is a place where you can safekeep things.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":1835,"context_line":"# Default backend class. (string value)"},{"line_number":1836,"context_line":"#storage_backend\u003dnova.scheduler.vault_backends.mysql.MySQL_Synchronizer"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":"# Default namespace to use. (string value)"},{"line_number":1839,"context_line":"#default_namespace\u003dnova"},{"line_number":1840,"context_line":""},{"line_number":1841,"context_line":"# Default primary key for namespace. (string value)"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91vw%3D","line":1838,"updated":"2013-12-05 11:33:35.000000000","message":"Can you please add a little meat here. It is not really clear by the description what this is actually used for","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":1835,"context_line":"# Default backend class. (string value)"},{"line_number":1836,"context_line":"#storage_backend\u003dnova.scheduler.vault_backends.mysql.MySQL_Synchronizer"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":"# Default namespace to use. (string value)"},{"line_number":1839,"context_line":"#default_namespace\u003dnova"},{"line_number":1840,"context_line":""},{"line_number":1841,"context_line":"# Default primary key for namespace. (string value)"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91WA%3D","line":1838,"in_reply_to":"AAAATn%2F91vw%3D","updated":"2013-12-05 13:24:23.000000000","message":"ok, I\u0027ll expand it a bit.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":1838,"context_line":"# Default namespace to use. (string value)"},{"line_number":1839,"context_line":"#default_namespace\u003dnova"},{"line_number":1840,"context_line":""},{"line_number":1841,"context_line":"# Default primary key for namespace. (string value)"},{"line_number":1842,"context_line":"#primary_key\u003dhostname"},{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":"# Time in seconds after which an update entry should"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91vo%3D","line":1841,"updated":"2013-12-05 11:33:35.000000000","message":"Ditto","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":1838,"context_line":"# Default namespace to use. (string value)"},{"line_number":1839,"context_line":"#default_namespace\u003dnova"},{"line_number":1840,"context_line":""},{"line_number":1841,"context_line":"# Default primary key for namespace. (string value)"},{"line_number":1842,"context_line":"#primary_key\u003dhostname"},{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":"# Time in seconds after which an update entry should"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91V8%3D","line":1841,"in_reply_to":"AAAATn%2F91vo%3D","updated":"2013-12-05 13:24:23.000000000","message":"ok, I\u0027ll expand it a bit.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":"# Time in seconds after which an update entry should"},{"line_number":1845,"context_line":"# beconsidered ready to be purged. (integer value)"},{"line_number":1846,"context_line":"#entry_expiration_time\u003d10"},{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"# Time in seconds since major backend failure has beenlast"},{"line_number":1849,"context_line":"# seen till state vault reinitialization. (integer value)"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91vk%3D","line":1846,"updated":"2013-12-05 11:33:35.000000000","message":"aging_time?","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":1843,"context_line":""},{"line_number":1844,"context_line":"# Time in seconds after which an update entry should"},{"line_number":1845,"context_line":"# beconsidered ready to be purged. (integer value)"},{"line_number":1846,"context_line":"#entry_expiration_time\u003d10"},{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"# Time in seconds since major backend failure has beenlast"},{"line_number":1849,"context_line":"# seen till state vault reinitialization. (integer value)"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91UI%3D","line":1846,"in_reply_to":"AAAATn%2F91vk%3D","updated":"2013-12-05 13:24:23.000000000","message":"senectitude_criterion?:) Seriously, is it that misleading to be discussed?","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"# Time in seconds since major backend failure has beenlast"},{"line_number":1849,"context_line":"# seen till state vault reinitialization. (integer value)"},{"line_number":1850,"context_line":"#reinitialization_delay\u003d60"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":""},{"line_number":1853,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91vQ%3D","line":1850,"updated":"2013-12-05 11:33:35.000000000","message":"is this something that is used if the connection is terminated at run time? if so then this should be reconnect_timeout","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"# Time in seconds since major backend failure has beenlast"},{"line_number":1849,"context_line":"# seen till state vault reinitialization. (integer value)"},{"line_number":1850,"context_line":"#reinitialization_delay\u003d60"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":""},{"line_number":1853,"context_line":"#"}],"source_content_type":"application/octet-stream","patch_set":19,"id":"AAAATn%2F91T4%3D","line":1850,"in_reply_to":"AAAATn%2F91vQ%3D","updated":"2013-12-05 13:24:23.000000000","message":"It is not only about reconnecting, but also about resetting local states and flags.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"f56e13438e4a4bfd98249b4a91f6c691c6cf6bad","unresolved":false,"context_lines":[{"line_number":1839,"context_line":"# has published this states. (string value)"},{"line_number":1840,"context_line":"#default_namespace\u003dnova"},{"line_number":1841,"context_line":""},{"line_number":1842,"context_line":"# Default primary key for namespace. This entry will beused to"},{"line_number":1843,"context_line":"# store state identifier. (string value)"},{"line_number":1844,"context_line":"#primary_key\u003dhostname"},{"line_number":1845,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":23,"id":"AAAATn%2F90To%3D","line":1842,"updated":"2013-12-05 16:26:17.000000000","message":"Typo: \"will be used\"","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"75b04278fd7ae9fe7bcd79d347a8d17781ecd3ef","unresolved":false,"context_lines":[{"line_number":1839,"context_line":"# has published this states. (string value)"},{"line_number":1840,"context_line":"#default_namespace\u003dnova"},{"line_number":1841,"context_line":""},{"line_number":1842,"context_line":"# Default primary key for namespace. This entry will beused to"},{"line_number":1843,"context_line":"# store state identifier. (string value)"},{"line_number":1844,"context_line":"#primary_key\u003dhostname"},{"line_number":1845,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":23,"id":"AAAATn%2F9wzg%3D","line":1842,"in_reply_to":"AAAATn%2F90To%3D","updated":"2013-12-06 09:00:51.000000000","message":"Done","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"f56e13438e4a4bfd98249b4a91f6c691c6cf6bad","unresolved":false,"context_lines":[{"line_number":1847,"context_line":"# beconsidered ready to be purged. (integer value)"},{"line_number":1848,"context_line":"#entry_expiration_time\u003d10"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"# Time in seconds since major backend failure has beenlast"},{"line_number":1851,"context_line":"# seen till state vault reinitialization. (integer value)"},{"line_number":1852,"context_line":"#reinitialization_delay\u003d60"},{"line_number":1853,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":23,"id":"AAAATn%2F90Sw%3D","line":1850,"updated":"2013-12-05 16:26:17.000000000","message":"ditto: \"has been last\"","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"75b04278fd7ae9fe7bcd79d347a8d17781ecd3ef","unresolved":false,"context_lines":[{"line_number":1847,"context_line":"# beconsidered ready to be purged. (integer value)"},{"line_number":1848,"context_line":"#entry_expiration_time\u003d10"},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"# Time in seconds since major backend failure has beenlast"},{"line_number":1851,"context_line":"# seen till state vault reinitialization. (integer value)"},{"line_number":1852,"context_line":"#reinitialization_delay\u003d60"},{"line_number":1853,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":23,"id":"AAAATn%2F9wzQ%3D","line":1850,"in_reply_to":"AAAATn%2F90Sw%3D","updated":"2013-12-06 09:00:51.000000000","message":"Done","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"bc46d8f16f7b28c51101c88776c7d8a7bed9d456","unresolved":false,"context_lines":[{"line_number":1852,"context_line":"#storage_backend\u003dnova.scheduler.vault_backends.mysql.MySQL_Synchronizer"},{"line_number":1853,"context_line":""},{"line_number":1854,"context_line":"# Default namespace to use. Namespaces indicate which service"},{"line_number":1855,"context_line":"# has published this states. (string value)"},{"line_number":1856,"context_line":"#default_namespace\u003dnova-hoststate"},{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"# Default primary key for namespace. This entry will be used"}],"source_content_type":"application/octet-stream","patch_set":38,"id":"AAAAT3%2F%2F1p0%3D","line":1855,"updated":"2013-12-30 12:32:36.000000000","message":"published this states \u003d\u003e publishes these states\nor\npublished these states","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":1852,"context_line":"#storage_backend\u003dnova.scheduler.vault_backends.mysql.MySQL_Synchronizer"},{"line_number":1853,"context_line":""},{"line_number":1854,"context_line":"# Default namespace to use. Namespaces indicate which service"},{"line_number":1855,"context_line":"# has published this states. (string value)"},{"line_number":1856,"context_line":"#default_namespace\u003dnova-hoststate"},{"line_number":1857,"context_line":""},{"line_number":1858,"context_line":"# Default primary key for namespace. This entry will be used"}],"source_content_type":"application/octet-stream","patch_set":38,"id":"AAAAUH%2F%2FtsM%3D","line":1855,"in_reply_to":"AAAAT3%2F%2F1p0%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"}],"nova/db/api.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def migration_get_unconfirmed_by_dest_compute(context, confirm_window,"},{"line_number":445,"context_line":"        dest_compute):"},{"line_number":446,"context_line":"    \"\"\""},{"line_number":447,"context_line":"    Finds all unconfirmed migrations within the confirmation window for"},{"line_number":448,"context_line":"    a specific destination compute host."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91vI%3D","line":445,"updated":"2013-12-05 11:33:35.000000000","message":"would this make the code no longer backward compatible - say there are still scheduler that are using the existing DB access.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"def migration_get_unconfirmed_by_dest_compute(context, confirm_window,"},{"line_number":445,"context_line":"        dest_compute):"},{"line_number":446,"context_line":"    \"\"\""},{"line_number":447,"context_line":"    Finds all unconfirmed migrations within the confirmation window for"},{"line_number":448,"context_line":"    a specific destination compute host."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91sE%3D","line":445,"in_reply_to":"AAAATn%2F91vI%3D","updated":"2013-12-05 13:24:23.000000000","message":"Looks like my fault. This was not suposed to be changed. Thank you for pointing this out.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":1913,"context_line":"                                               max_rows\u003dmax_rows)"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":""},{"line_number":1916,"context_line":"def synchronizer_namespace_get(context, name):"},{"line_number":1917,"context_line":"    return IMPL.synchronizer_namespace_get(context, name)"},{"line_number":1918,"context_line":""},{"line_number":1919,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91vE%3D","line":1916,"updated":"2013-12-05 11:33:35.000000000","message":"do we want a predefined synchronization API?","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":1913,"context_line":"                                               max_rows\u003dmax_rows)"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":""},{"line_number":1916,"context_line":"def synchronizer_namespace_get(context, name):"},{"line_number":1917,"context_line":"    return IMPL.synchronizer_namespace_get(context, name)"},{"line_number":1918,"context_line":""},{"line_number":1919,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91r0%3D","line":1916,"in_reply_to":"AAAATn%2F91vE%3D","updated":"2013-12-05 13:24:23.000000000","message":"Could you please elaborate?","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":614,"context_line":"    \"\"\""},{"line_number":615,"context_line":"    try:"},{"line_number":616,"context_line":"        values.pop(\u0027service\u0027)"},{"line_number":617,"context_line":"    except Exception:"},{"line_number":618,"context_line":"        pass"},{"line_number":619,"context_line":"    _prep_stats_dict(values)"},{"line_number":620,"context_line":"    convert_datetimes(values, \u0027created_at\u0027, \u0027deleted_at\u0027, \u0027updated_at\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNNU%3D","line":617,"updated":"2013-10-02 14:19:36.000000000","message":"Don\u0027t intercept abstract Exception. KeyError would be enough here.\nYou also might have meant\n\n    values.pop(\u0027service\u0027, None)\n\nThat doesn\u0027t raise KeyError.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":614,"context_line":"    \"\"\""},{"line_number":615,"context_line":"    try:"},{"line_number":616,"context_line":"        values.pop(\u0027service\u0027)"},{"line_number":617,"context_line":"    except Exception:"},{"line_number":618,"context_line":"        pass"},{"line_number":619,"context_line":"    _prep_stats_dict(values)"},{"line_number":620,"context_line":"    convert_datetimes(values, \u0027created_at\u0027, \u0027deleted_at\u0027, \u0027updated_at\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fv9s%3D","line":617,"in_reply_to":"AAAAS3%2F%2FNNU%3D","updated":"2013-10-10 11:29:21.000000000","message":"Good point, thank you. Fixed that.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":667,"context_line":""},{"line_number":668,"context_line":"    try:"},{"line_number":669,"context_line":"        values.pop(\u0027service\u0027)"},{"line_number":670,"context_line":"    except Exception:"},{"line_number":671,"context_line":"        pass"},{"line_number":672,"context_line":"    stats \u003d values.pop(\u0027stats\u0027, {})"},{"line_number":673,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNNQ%3D","line":670,"updated":"2013-10-02 14:19:36.000000000","message":"ditto","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":667,"context_line":""},{"line_number":668,"context_line":"    try:"},{"line_number":669,"context_line":"        values.pop(\u0027service\u0027)"},{"line_number":670,"context_line":"    except Exception:"},{"line_number":671,"context_line":"        pass"},{"line_number":672,"context_line":"    stats \u003d values.pop(\u0027stats\u0027, {})"},{"line_number":673,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fv9o%3D","line":670,"in_reply_to":"AAAAS3%2F%2FNNQ%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":7624,"name":"Herman Narkaytis","email":"hnarkaytis@mirantis.com","username":"hnarkaytis"},"change_message_id":"7a9cacc1c9a3dd497a37e63ce6e07c159cc22b3f","unresolved":false,"context_lines":[{"line_number":6117,"context_line":"            if record is None:"},{"line_number":6118,"context_line":"                raise Exception"},{"line_number":6119,"context_line":"        record.value \u003d value"},{"line_number":6120,"context_line":"        record.namespace_id \u003d namespace_id"},{"line_number":6121,"context_line":"        session.add(record)"},{"line_number":6122,"context_line":"        session.flush()"},{"line_number":6123,"context_line":"        update \u003d models.SynchronizerUpdates()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BbPE%3D","line":6120,"updated":"2013-11-26 09:11:40.000000000","message":"this should be moved to \u0027else\u0027 branch","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8d0a0e024926604562f69c3dbf86df089e55ad53","unresolved":false,"context_lines":[{"line_number":6117,"context_line":"            if record is None:"},{"line_number":6118,"context_line":"                raise Exception"},{"line_number":6119,"context_line":"        record.value \u003d value"},{"line_number":6120,"context_line":"        record.namespace_id \u003d namespace_id"},{"line_number":6121,"context_line":"        session.add(record)"},{"line_number":6122,"context_line":"        session.flush()"},{"line_number":6123,"context_line":"        update \u003d models.SynchronizerUpdates()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Ba3E%3D","line":6120,"in_reply_to":"AAAATn%2F%2BbPE%3D","updated":"2013-11-26 10:14:53.000000000","message":"Done","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":7624,"name":"Herman Narkaytis","email":"hnarkaytis@mirantis.com","username":"hnarkaytis"},"change_message_id":"7a9cacc1c9a3dd497a37e63ce6e07c159cc22b3f","unresolved":false,"context_lines":[{"line_number":6118,"context_line":"                raise Exception"},{"line_number":6119,"context_line":"        record.value \u003d value"},{"line_number":6120,"context_line":"        record.namespace_id \u003d namespace_id"},{"line_number":6121,"context_line":"        session.add(record)"},{"line_number":6122,"context_line":"        session.flush()"},{"line_number":6123,"context_line":"        update \u003d models.SynchronizerUpdates()"},{"line_number":6124,"context_line":"        update.record_id \u003d record.id"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BbO4%3D","line":6121,"updated":"2013-11-26 09:11:40.000000000","message":"this should be moved to \u0027if token is None\u0027 branch","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8d0a0e024926604562f69c3dbf86df089e55ad53","unresolved":false,"context_lines":[{"line_number":6118,"context_line":"                raise Exception"},{"line_number":6119,"context_line":"        record.value \u003d value"},{"line_number":6120,"context_line":"        record.namespace_id \u003d namespace_id"},{"line_number":6121,"context_line":"        session.add(record)"},{"line_number":6122,"context_line":"        session.flush()"},{"line_number":6123,"context_line":"        update \u003d models.SynchronizerUpdates()"},{"line_number":6124,"context_line":"        update.record_id \u003d record.id"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Ba28%3D","line":6121,"in_reply_to":"AAAATn%2F%2BbO4%3D","updated":"2013-11-26 10:14:53.000000000","message":"Done","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":6118,"context_line":"                                 session\u003dsession, read_deleted\u003d\"no\").\\"},{"line_number":6119,"context_line":"                                 filter(records.id \u003d\u003d int(token)).first()"},{"line_number":6120,"context_line":"            if record is None:"},{"line_number":6121,"context_line":"                raise Exception"},{"line_number":6122,"context_line":"        record.value \u003d value"},{"line_number":6123,"context_line":"        session.flush()"},{"line_number":6124,"context_line":"        update \u003d models.SynchronizerUpdates()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BavE%3D","line":6121,"updated":"2013-11-26 10:55:11.000000000","message":"Raise more specific exception here.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":6118,"context_line":"                                 session\u003dsession, read_deleted\u003d\"no\").\\"},{"line_number":6119,"context_line":"                                 filter(records.id \u003d\u003d int(token)).first()"},{"line_number":6120,"context_line":"            if record is None:"},{"line_number":6121,"context_line":"                raise Exception"},{"line_number":6122,"context_line":"        record.value \u003d value"},{"line_number":6123,"context_line":"        session.flush()"},{"line_number":6124,"context_line":"        update \u003d models.SynchronizerUpdates()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BaBA%3D","line":6121,"in_reply_to":"AAAATn%2F%2BavE%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        # OK, filtering on this key; what value do we search for?"},{"line_number":263,"context_line":"        value \u003d filters.pop(key)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        if key \u003d\u003d \u0027metadata\u0027 or key \u003d\u003d \u0027system_metadata\u0027:"},{"line_number":266,"context_line":"            column_attr \u003d getattr(model, key)"},{"line_number":267,"context_line":"            if isinstance(value, list):"},{"line_number":268,"context_line":"                for item in value:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91u4%3D","line":265,"updated":"2013-12-05 11:33:35.000000000","message":"not related to this patch set. in previous patch sets this was actually requested - not sure why you are changing this","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        # OK, filtering on this key; what value do we search for?"},{"line_number":263,"context_line":"        value \u003d filters.pop(key)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        if key \u003d\u003d \u0027metadata\u0027 or key \u003d\u003d \u0027system_metadata\u0027:"},{"line_number":266,"context_line":"            column_attr \u003d getattr(model, key)"},{"line_number":267,"context_line":"            if isinstance(value, list):"},{"line_number":268,"context_line":"                for item in value:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91q4%3D","line":265,"in_reply_to":"AAAATn%2F91u4%3D","updated":"2013-12-05 13:24:23.000000000","message":"Yes, this part  is somewhat screwed, I am fixing it now.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"}],"nova/scheduler/filter_scheduler.py":[{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"14afdb72e6b8e0ee71fb047fac9914b365582aeb","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def compute_node_update(self, hostid, values):"},{"line_number":66,"context_line":"        self.host_manager.compute_node_update(hostid, values)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def schedule_run_instance(self, context, request_spec,"},{"line_number":69,"context_line":"                              admin_password, injected_files,"},{"line_number":70,"context_line":"                              requested_networks, is_first_time,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2FsP8%3D","line":67,"updated":"2013-10-11 08:29:30.000000000","message":"why not put the function to super class (i.e. driver.Scheduler)?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"c7e1d843c0c02b92cee0515f424d4bcf57a929cc","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def compute_node_update(self, hostid, values):"},{"line_number":66,"context_line":"        self.host_manager.compute_node_update(hostid, values)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def schedule_run_instance(self, context, request_spec,"},{"line_number":69,"context_line":"                              admin_password, injected_files,"},{"line_number":70,"context_line":"                              requested_networks, is_first_time,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fa3E%3D","line":67,"in_reply_to":"AAAATH%2F%2FsP8%3D","updated":"2013-10-16 13:12:02.000000000","message":"Yes, good point.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"nova/scheduler/host_manager.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from nova.pci import pci_stats"},{"line_number":33,"context_line":"from nova.scheduler import filters"},{"line_number":34,"context_line":"from nova.scheduler import weights"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from nova.scheduler import mc_synchro"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"host_manager_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNNE%3D","line":35,"updated":"2013-10-02 14:19:36.000000000","message":"Extra space, wrong order.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from nova.pci import pci_stats"},{"line_number":33,"context_line":"from nova.scheduler import filters"},{"line_number":34,"context_line":"from nova.scheduler import weights"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from nova.scheduler import mc_synchro"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"host_manager_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fv%2BE%3D","line":35,"in_reply_to":"AAAAS3%2F%2FNNE%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self.vcpus_total \u003d compute[\u0027vcpus\u0027]"},{"line_number":170,"context_line":"        self.vcpus_used \u003d compute[\u0027vcpus_used\u0027]"},{"line_number":171,"context_line":"        self.updated \u003d compute[\u0027service\u0027][\u0027updated_at\u0027]"},{"line_number":172,"context_line":"        if hasattr(compute, \u0027pci_stats\u0027):"},{"line_number":173,"context_line":"            self.pci_stats \u003d pci_stats.PciDeviceStats(compute[\u0027pci_stats\u0027])"},{"line_number":174,"context_line":"        else:"},{"line_number":175,"context_line":"            self.pci_stats \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNME%3D","line":172,"updated":"2013-10-02 14:19:36.000000000","message":"Why did you have to change this to hasattr? You access this attribute as a value in a dict anyway.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self.vcpus_total \u003d compute[\u0027vcpus\u0027]"},{"line_number":170,"context_line":"        self.vcpus_used \u003d compute[\u0027vcpus_used\u0027]"},{"line_number":171,"context_line":"        self.updated \u003d compute[\u0027service\u0027][\u0027updated_at\u0027]"},{"line_number":172,"context_line":"        if hasattr(compute, \u0027pci_stats\u0027):"},{"line_number":173,"context_line":"            self.pci_stats \u003d pci_stats.PciDeviceStats(compute[\u0027pci_stats\u0027])"},{"line_number":174,"context_line":"        else:"},{"line_number":175,"context_line":"            self.pci_stats \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fv%2BM%3D","line":172,"in_reply_to":"AAAAS3%2F%2FNME%3D","updated":"2013-10-10 11:29:21.000000000","message":"My bad, apparently did it while merging. Fixed that.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"bd411281a0b7d7176acc9e737fba81051cccb037","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from nova.pci import pci_request"},{"line_number":32,"context_line":"from nova.pci import pci_stats"},{"line_number":33,"context_line":"from nova.scheduler import filters"},{"line_number":34,"context_line":"from nova.scheduler import mc_synchro"},{"line_number":35,"context_line":"from nova.scheduler import weights"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FtJY%3D","line":34,"updated":"2013-10-30 08:15:06.000000000","message":"In my understanding, this bp is targeting for solving performance and scaling issue with many compute nodes in mind. However, introducing memcached involves additional dependency and might be unnecessarily complex for small scale deployment.\n\nSo, can we at least make this feature configurable and still leave DB option a choice?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b17bcb74ce6dbe2baa762a13299512c7caee461f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from nova.pci import pci_request"},{"line_number":32,"context_line":"from nova.pci import pci_stats"},{"line_number":33,"context_line":"from nova.scheduler import filters"},{"line_number":34,"context_line":"from nova.scheduler import mc_synchro"},{"line_number":35,"context_line":"from nova.scheduler import weights"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS9M%3D","line":34,"in_reply_to":"AAAATn%2F%2FtJY%3D","updated":"2013-11-11 14:02:58.000000000","message":"Well, I think yes, it doesn\u0027t require that much to do so. On the other hand I don\u0027t like the idea of adding yet another option to consider when configuring a cloud. I mean that too many options may lead to confusion, inefficient configurations and as a result to reduced user experience. I\u0027ll add this option anyway and we\u0027ll see how it works out.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"bd411281a0b7d7176acc9e737fba81051cccb037","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        \"\"\""},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"        # Get resource usage across the available compute nodes:"},{"line_number":431,"context_line":"        compute_nodes \u003d self.mc_synchronizer.get_all()"},{"line_number":432,"context_line":"        seen_nodes \u003d set()"},{"line_number":433,"context_line":"        for compute in compute_nodes:"},{"line_number":434,"context_line":"            service \u003d compute[\u0027service\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FtC4%3D","line":431,"updated":"2013-10-30 08:15:06.000000000","message":"Again, can you make memcached an optional feature, so that end users of different deployment size could all benefit?\n\nPlease check servicegroup_driver_opt in servicegroup/api.py for reference.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b17bcb74ce6dbe2baa762a13299512c7caee461f","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        \"\"\""},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"        # Get resource usage across the available compute nodes:"},{"line_number":431,"context_line":"        compute_nodes \u003d self.mc_synchronizer.get_all()"},{"line_number":432,"context_line":"        seen_nodes \u003d set()"},{"line_number":433,"context_line":"        for compute in compute_nodes:"},{"line_number":434,"context_line":"            service \u003d compute[\u0027service\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS9I%3D","line":431,"in_reply_to":"AAAATn%2F%2FtC4%3D","updated":"2013-11-11 14:02:58.000000000","message":"Thank you, I\u0027ll check it.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"bd411281a0b7d7176acc9e737fba81051cccb037","unresolved":false,"context_lines":[{"line_number":461,"context_line":""},{"line_number":462,"context_line":"        return self.host_state_map.itervalues()"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    def compute_node_update(self, hostid, values):"},{"line_number":465,"context_line":"        self.mc_synchronizer.update_host(hostid, values)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FtD0%3D","line":464,"updated":"2013-10-30 08:15:06.000000000","message":"Maybe... mc_update_compute_node should be a better naming to differentiate from update_from_compute_node call in host_manager.py.\n\nFirst because this function is for memcache use only. Second, verb_object naming to make it consistent with other function names.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b17bcb74ce6dbe2baa762a13299512c7caee461f","unresolved":false,"context_lines":[{"line_number":461,"context_line":""},{"line_number":462,"context_line":"        return self.host_state_map.itervalues()"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"    def compute_node_update(self, hostid, values):"},{"line_number":465,"context_line":"        self.mc_synchronizer.update_host(hostid, values)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS88%3D","line":464,"in_reply_to":"AAAATn%2F%2FtD0%3D","updated":"2013-11-11 14:02:58.000000000","message":"Ok. Let it be mc_update_compute_node.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"nova/scheduler/mc_synchro.py":[{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"a1d157dab515b54aea1c3d879eaf64ed2aed1285","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import collections"},{"line_number":2,"context_line":"import copy"},{"line_number":3,"context_line":"import memcache  # pylibmc looks like a slightly better option."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"from nova.openstack.common import timeutils"},{"line_number":6,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FbPs%3D","line":3,"updated":"2013-09-27 09:13:12.000000000","message":"after we get results from testing on real deployment we will see.","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"47efa09749ddbc64d9828cce59082fb571d85c66","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import collections"},{"line_number":2,"context_line":"import copy"},{"line_number":3,"context_line":"import memcache  # pylibmc looks like a slightly better option."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"from nova.openstack.common import timeutils"},{"line_number":6,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FZ8E%3D","line":3,"in_reply_to":"AAAAS3%2F%2FbPs%3D","updated":"2013-09-27 11:20:28.000000000","message":"agreed, I\u0027ll remove the comment to avoid confusion.","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"a1d157dab515b54aea1c3d879eaf64ed2aed1285","unresolved":false,"context_lines":[{"line_number":8,"context_line":"class MCSynchronizer(object):"},{"line_number":9,"context_line":"    \"\"\"A class to handle state synchronization."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Previously transient host statistics has been routed through database."},{"line_number":12,"context_line":"While working on smallscale it could not be scaled well enough, also"},{"line_number":13,"context_line":"at the end of the day it was the scheduler who kept the entire dataset"},{"line_number":14,"context_line":"in its local memory. While been slow this approach allowed to have"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FbQA%3D","line":11,"updated":"2013-09-27 09:13:12.000000000","message":"align this to previous line (+2 tabs)","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"47efa09749ddbc64d9828cce59082fb571d85c66","unresolved":false,"context_lines":[{"line_number":8,"context_line":"class MCSynchronizer(object):"},{"line_number":9,"context_line":"    \"\"\"A class to handle state synchronization."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Previously transient host statistics has been routed through database."},{"line_number":12,"context_line":"While working on smallscale it could not be scaled well enough, also"},{"line_number":13,"context_line":"at the end of the day it was the scheduler who kept the entire dataset"},{"line_number":14,"context_line":"in its local memory. While been slow this approach allowed to have"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FZ7w%3D","line":11,"in_reply_to":"AAAAS3%2F%2FbQA%3D","updated":"2013-09-27 11:20:28.000000000","message":"Done","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"a1d157dab515b54aea1c3d879eaf64ed2aed1285","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                    self.record_id_index[state[\u0027record_id\u0027]] \u003d state"},{"line_number":103,"context_line":"            self.local_update_counter \u003d cur_ctr"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"# Now we must check if local_update_counter is ahead of the one in mc."},{"line_number":106,"context_line":"# This is a very bad omen if true as it basically means that memcached has"},{"line_number":107,"context_line":"# crashed. Thus we need both to refill mc and to keep provisioning schedulers"},{"line_number":108,"context_line":"# with data. It won\u0027t be fresh, but hey, it is a disaster time so better"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FbQU%3D","line":105,"updated":"2013-09-27 09:13:12.000000000","message":"align pls this to if","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"47efa09749ddbc64d9828cce59082fb571d85c66","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                    self.record_id_index[state[\u0027record_id\u0027]] \u003d state"},{"line_number":103,"context_line":"            self.local_update_counter \u003d cur_ctr"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"# Now we must check if local_update_counter is ahead of the one in mc."},{"line_number":106,"context_line":"# This is a very bad omen if true as it basically means that memcached has"},{"line_number":107,"context_line":"# crashed. Thus we need both to refill mc and to keep provisioning schedulers"},{"line_number":108,"context_line":"# with data. It won\u0027t be fresh, but hey, it is a disaster time so better"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FZ7k%3D","line":105,"in_reply_to":"AAAAS3%2F%2FbQU%3D","updated":"2013-09-27 11:20:28.000000000","message":"Done","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"a1d157dab515b54aea1c3d879eaf64ed2aed1285","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def _synchronize(f):"},{"line_number":127,"context_line":"        \"\"\"A decorator to keep local host pool up to date."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"self.synchronize_with_mc() does all the job, this one just decorates things."},{"line_number":130,"context_line":"\"\"\""},{"line_number":131,"context_line":"        def wrapper(self, *args, **kwargs):"},{"line_number":132,"context_line":"            self.synchronize_with_mc()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FbQI%3D","line":129,"updated":"2013-09-27 09:13:12.000000000","message":"align this to previous line","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"47efa09749ddbc64d9828cce59082fb571d85c66","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    def _synchronize(f):"},{"line_number":127,"context_line":"        \"\"\"A decorator to keep local host pool up to date."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"self.synchronize_with_mc() does all the job, this one just decorates things."},{"line_number":130,"context_line":"\"\"\""},{"line_number":131,"context_line":"        def wrapper(self, *args, **kwargs):"},{"line_number":132,"context_line":"            self.synchronize_with_mc()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAS3%2F%2FZ7o%3D","line":129,"in_reply_to":"AAAAS3%2F%2FbQI%3D","updated":"2013-09-27 11:20:28.000000000","message":"Done","commit_id":"8bebe24fa7c87a957b9755bd8f11fd933eee32b5"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        if addresses is None:"},{"line_number":30,"context_line":"            addresses \u003d [\u0027127.0.0.1:11211\u0027]"},{"line_number":31,"context_line":"        self.mc_client \u003d memcache.Client(addresses, debug\u003d0)  # try pylibmc."},{"line_number":32,"context_line":"        self.MCDead_flag \u003d None  # a flag to track mc health."},{"line_number":33,"context_line":"        self.hostname_index \u003d {}"},{"line_number":34,"context_line":"        self.record_id_index \u003d {}"},{"line_number":35,"context_line":"        self.local_update_counter \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNJI%3D","line":32,"updated":"2013-10-02 14:19:36.000000000","message":"Don\u0027t use camelcase for variable names","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        if addresses is None:"},{"line_number":30,"context_line":"            addresses \u003d [\u0027127.0.0.1:11211\u0027]"},{"line_number":31,"context_line":"        self.mc_client \u003d memcache.Client(addresses, debug\u003d0)  # try pylibmc."},{"line_number":32,"context_line":"        self.MCDead_flag \u003d None  # a flag to track mc health."},{"line_number":33,"context_line":"        self.hostname_index \u003d {}"},{"line_number":34,"context_line":"        self.record_id_index \u003d {}"},{"line_number":35,"context_line":"        self.local_update_counter \u003d 0"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fv%2Fo%3D","line":32,"in_reply_to":"AAAAS3%2F%2FNJI%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.record_id_index \u003d {}"},{"line_number":35,"context_line":"        self.local_update_counter \u003d 0"},{"line_number":36,"context_line":"        self.UpdateHole \u003d collections.namedtuple("},{"line_number":37,"context_line":"            \u0027UpdateHole\u0027, [\u0027update_id\u0027, \u0027time\u0027])"},{"line_number":38,"context_line":"        self.chunk_size \u003d 50  # number of records to be read in batch"},{"line_number":39,"context_line":"        self.rottime \u003d 10  # seconds to wait before reinitializing if upd hole"},{"line_number":40,"context_line":"        self.resurrect_time \u003d 1  # time to wait after mc death to repopulate"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNJE%3D","line":37,"updated":"2013-10-02 14:19:36.000000000","message":"This should be moved to the module level","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.record_id_index \u003d {}"},{"line_number":35,"context_line":"        self.local_update_counter \u003d 0"},{"line_number":36,"context_line":"        self.UpdateHole \u003d collections.namedtuple("},{"line_number":37,"context_line":"            \u0027UpdateHole\u0027, [\u0027update_id\u0027, \u0027time\u0027])"},{"line_number":38,"context_line":"        self.chunk_size \u003d 50  # number of records to be read in batch"},{"line_number":39,"context_line":"        self.rottime \u003d 10  # seconds to wait before reinitializing if upd hole"},{"line_number":40,"context_line":"        self.resurrect_time \u003d 1  # time to wait after mc death to repopulate"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fv%2Fs%3D","line":37,"in_reply_to":"AAAAS3%2F%2FNJE%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._update_self()"},{"line_number":45,"context_line":"        super(MCSynchronizer, self).__init__()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    # TODO(alexey): reword comments properly and move them to docstrings."},{"line_number":48,"context_line":"    #"},{"line_number":49,"context_line":"    # apparently here must be added a set of broken updates which can be"},{"line_number":50,"context_line":"    # detected as an unset update number. Whenever we encounter an update"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNLk%3D","line":47,"updated":"2013-10-02 14:19:36.000000000","message":"Use your launchpad or Gerrit ID in TODO.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self._update_self()"},{"line_number":45,"context_line":"        super(MCSynchronizer, self).__init__()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    # TODO(alexey): reword comments properly and move them to docstrings."},{"line_number":48,"context_line":"    #"},{"line_number":49,"context_line":"    # apparently here must be added a set of broken updates which can be"},{"line_number":50,"context_line":"    # detected as an unset update number. Whenever we encounter an update"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2Fv%2F4%3D","line":47,"in_reply_to":"AAAAS3%2F%2FNLk%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def synchronize_with_mc(self):"},{"line_number":57,"context_line":"        \"\"\"Actual synchronizer which keeps mc and local state coherent."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    If local updates counter differs from the one stored in memcached"},{"line_number":60,"context_line":"    and is lower than that then this object has missed some updates so it"},{"line_number":61,"context_line":"    is time to get it right."},{"line_number":62,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNJc%3D","line":59,"updated":"2013-10-02 14:19:36.000000000","message":"Bad indent","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def synchronize_with_mc(self):"},{"line_number":57,"context_line":"        \"\"\"Actual synchronizer which keeps mc and local state coherent."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    If local updates counter differs from the one stored in memcached"},{"line_number":60,"context_line":"    and is lower than that then this object has missed some updates so it"},{"line_number":61,"context_line":"    is time to get it right."},{"line_number":62,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwK0%3D","line":59,"in_reply_to":"AAAAS3%2F%2FNJc%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                else:"},{"line_number":95,"context_line":"                    updated_records.add(record_id)"},{"line_number":96,"context_line":"            updated_records \u003d list(updated_records)"},{"line_number":97,"context_line":"            for i in range(0, len(updated_records), self.chunk_size):"},{"line_number":98,"context_line":"                record_names \u003d map(self._get_state_record_name,"},{"line_number":99,"context_line":"                                   updated_records[i:i + self.chunk_size])"},{"line_number":100,"context_line":"                fresh_states \u003d self._get_batch(record_names)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNJg%3D","line":97,"updated":"2013-10-02 14:19:36.000000000","message":"You can do it like this:\n\n    for chunk in itertools.izip_longest(*[iter(updated_records)]*self.chuck_size):\n        record_names \u003d map(self._get_state_record_name, filter(None, chuck))\n        \u003c....\u003e\n\nYou won\u0027t even need to convert updated_records to a list then.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                else:"},{"line_number":95,"context_line":"                    updated_records.add(record_id)"},{"line_number":96,"context_line":"            updated_records \u003d list(updated_records)"},{"line_number":97,"context_line":"            for i in range(0, len(updated_records), self.chunk_size):"},{"line_number":98,"context_line":"                record_names \u003d map(self._get_state_record_name,"},{"line_number":99,"context_line":"                                   updated_records[i:i + self.chunk_size])"},{"line_number":100,"context_line":"                fresh_states \u003d self._get_batch(record_names)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwI0%3D","line":97,"in_reply_to":"AAAAS3%2F%2FNJg%3D","updated":"2013-10-10 11:29:21.000000000","message":"Yes, this is a better way to solve this problem, but it looks a little less obvious. I\u0027ll pobably keep my current solution for now.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def _synchronize(f):"},{"line_number":128,"context_line":"        \"\"\"A decorator to keep local host pool up to date."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    self.synchronize_with_mc() does all the job, this one is just a helper."},{"line_number":131,"context_line":"    \"\"\""},{"line_number":132,"context_line":"        def wrapper(self, *args, **kwargs):"},{"line_number":133,"context_line":"            self.synchronize_with_mc()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FNIk%3D","line":130,"updated":"2013-10-02 14:19:36.000000000","message":"Bad indent","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def _synchronize(f):"},{"line_number":128,"context_line":"        \"\"\"A decorator to keep local host pool up to date."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    self.synchronize_with_mc() does all the job, this one is just a helper."},{"line_number":131,"context_line":"    \"\"\""},{"line_number":132,"context_line":"        def wrapper(self, *args, **kwargs):"},{"line_number":133,"context_line":"            self.synchronize_with_mc()"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwLA%3D","line":130,"in_reply_to":"AAAAS3%2F%2FNIk%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def _prepare_cache(self):"},{"line_number":177,"context_line":"        def check_field(field):"},{"line_number":178,"context_line":"            res \u003d self.mc_client.get(field)"},{"line_number":179,"context_line":"            if res is None:"},{"line_number":180,"context_line":"                self.mc_client.set(field, 0)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        for field in [self._upd_field, self._rec_field]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FMv8%3D","line":179,"updated":"2013-10-02 14:19:36.000000000","message":"There\u0027s a possible race condition here.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    def _prepare_cache(self):"},{"line_number":177,"context_line":"        def check_field(field):"},{"line_number":178,"context_line":"            res \u003d self.mc_client.get(field)"},{"line_number":179,"context_line":"            if res is None:"},{"line_number":180,"context_line":"                self.mc_client.set(field, 0)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        for field in [self._upd_field, self._rec_field]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwMA%3D","line":179,"in_reply_to":"AAAAS3%2F%2FMv8%3D","updated":"2013-10-10 11:29:21.000000000","message":"Thanks, this is a good point. I\u0027ll try to avoid it with add()","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"bd411281a0b7d7176acc9e737fba81051cccb037","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import collections"},{"line_number":2,"context_line":"import copy"},{"line_number":3,"context_line":"import memcache"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2Fs%2FA%3D","line":1,"updated":"2013-10-30 08:15:06.000000000","message":"Licence disclaimer please?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b17bcb74ce6dbe2baa762a13299512c7caee461f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import collections"},{"line_number":2,"context_line":"import copy"},{"line_number":3,"context_line":"import memcache"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS%2Fs%3D","line":1,"in_reply_to":"AAAATn%2F%2Fs%2FA%3D","updated":"2013-11-11 14:02:58.000000000","message":"sure!","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"bd411281a0b7d7176acc9e737fba81051cccb037","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import collections"},{"line_number":2,"context_line":"import copy"},{"line_number":3,"context_line":"import memcache"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"from nova.openstack.common import timeutils"},{"line_number":6,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FtAM%3D","line":3,"updated":"2013-10-30 08:15:06.000000000","message":"Maybe you should consider using nova.openstack.common.memorycache instead?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b17bcb74ce6dbe2baa762a13299512c7caee461f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import collections"},{"line_number":2,"context_line":"import copy"},{"line_number":3,"context_line":"import memcache"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"from nova.openstack.common import timeutils"},{"line_number":6,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS%2BQ%3D","line":3,"in_reply_to":"AAAATn%2F%2FtAM%3D","updated":"2013-11-11 14:02:58.000000000","message":"Definitely. When I started working on this I used pylibmc, so this is a relic from that age. This one seems to be a little bit faster. Afaik memcached still has to be included in standard dependencies list anyway.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"14afdb72e6b8e0ee71fb047fac9914b365582aeb","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # everything is just fine, if it is not and one of the timers is expired"},{"line_number":54,"context_line":"    # them we reinitialize the scheduler. If no timers are expired we try to"},{"line_number":55,"context_line":"    # re-read this updates."},{"line_number":56,"context_line":"    def synchronize_with_mc(self):"},{"line_number":57,"context_line":"        \"\"\"Actual synchronizer which keeps mc and local state coherent."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        If local updates counter differs from the one stored in memcached"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fr1c%3D","line":56,"updated":"2013-10-11 08:29:30.000000000","message":"I think making a local cache really makes things complex. any strong reason to keep local copy for each scheduler?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"c7e1d843c0c02b92cee0515f424d4bcf57a929cc","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    # everything is just fine, if it is not and one of the timers is expired"},{"line_number":54,"context_line":"    # them we reinitialize the scheduler. If no timers are expired we try to"},{"line_number":55,"context_line":"    # re-read this updates."},{"line_number":56,"context_line":"    def synchronize_with_mc(self):"},{"line_number":57,"context_line":"        \"\"\"Actual synchronizer which keeps mc and local state coherent."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        If local updates counter differs from the one stored in memcached"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fa4w%3D","line":56,"in_reply_to":"AAAATH%2F%2Fr1c%3D","updated":"2013-10-16 13:12:02.000000000","message":"It saves gobs of time. DB access appears to be very slow in case of 10k+ nodes and apparently access time grows exponentially with the number of nodes. Keeping in mind that we eventually end up with entire compute_nodes table in local memory it seems reasonable to keep local copy and put some effort into maintaining it.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"14afdb72e6b8e0ee71fb047fac9914b365582aeb","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        return self._get_name(self._rec_prefix, rec_id)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def _get_update_count(self):"},{"line_number":147,"context_line":"        return self.mc_client.get(self._upd_field)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _get_batch(self, names):"},{"line_number":150,"context_line":"        return self.mc_client.get_multi(names).values()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fr1k%3D","line":147,"updated":"2013-10-11 08:29:30.000000000","message":"this fn seems unnecessary because only one place calls it.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"c7e1d843c0c02b92cee0515f424d4bcf57a929cc","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        return self._get_name(self._rec_prefix, rec_id)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def _get_update_count(self):"},{"line_number":147,"context_line":"        return self.mc_client.get(self._upd_field)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _get_batch(self, names):"},{"line_number":150,"context_line":"        return self.mc_client.get_multi(names).values()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fa4k%3D","line":147,"in_reply_to":"AAAATH%2F%2Fr1k%3D","updated":"2013-10-16 13:12:02.000000000","message":"Right, I\u0027ll get rid of it.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"bd411281a0b7d7176acc9e737fba81051cccb037","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # this must be named initialize_self or sth"},{"line_number":159,"context_line":"        \"\"\"A function to populate local host states at late start/restart.\"\"\""},{"line_number":160,"context_line":"        self.local_update_counter \u003d self.mc_client.get(self._rec_field)"},{"line_number":161,"context_line":"        records_count \u003d self.mc_client.get(self._rec_field)"},{"line_number":162,"context_line":"        for i in xrange(0, records_count, self.chunk_size):"},{"line_number":163,"context_line":"            limit \u003d min(records_count, i + self.chunk_size)"},{"line_number":164,"context_line":"            host_names \u003d map(self._get_state_record_name, range(i, limit))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FtBM%3D","line":161,"updated":"2013-10-30 08:15:06.000000000","message":"Seems to be redundant, line #161 and #160. Why records_count since you\u0027ve already had local_update_counter?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b17bcb74ce6dbe2baa762a13299512c7caee461f","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        # this must be named initialize_self or sth"},{"line_number":159,"context_line":"        \"\"\"A function to populate local host states at late start/restart.\"\"\""},{"line_number":160,"context_line":"        self.local_update_counter \u003d self.mc_client.get(self._rec_field)"},{"line_number":161,"context_line":"        records_count \u003d self.mc_client.get(self._rec_field)"},{"line_number":162,"context_line":"        for i in xrange(0, records_count, self.chunk_size):"},{"line_number":163,"context_line":"            limit \u003d min(records_count, i + self.chunk_size)"},{"line_number":164,"context_line":"            host_names \u003d map(self._get_state_record_name, range(i, limit))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS%2BI%3D","line":161,"in_reply_to":"AAAATn%2F%2FtBM%3D","updated":"2013-11-11 14:02:58.000000000","message":"Thank you, I\u0027ll fix this.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"14afdb72e6b8e0ee71fb047fac9914b365582aeb","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        recname \u003d self._get_state_record_name(recnum)"},{"line_number":187,"context_line":"        hostdata[\u0027record_id\u0027] \u003d recnum"},{"line_number":188,"context_line":"        self.mc_client.set(recname, hostdata)"},{"line_number":189,"context_line":"        self.record_id_index[recnum] \u003d hostdata"},{"line_number":190,"context_line":"        self.hostname_index[hostname] \u003d hostdata"},{"line_number":191,"context_line":"        self._update_update_coutner(hostdata[\u0027record_id\u0027])"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fr6s%3D","line":189,"updated":"2013-10-11 08:29:30.000000000","message":"you can replace the above 3 lines with _update_main_record().","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"c7e1d843c0c02b92cee0515f424d4bcf57a929cc","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        recname \u003d self._get_state_record_name(recnum)"},{"line_number":187,"context_line":"        hostdata[\u0027record_id\u0027] \u003d recnum"},{"line_number":188,"context_line":"        self.mc_client.set(recname, hostdata)"},{"line_number":189,"context_line":"        self.record_id_index[recnum] \u003d hostdata"},{"line_number":190,"context_line":"        self.hostname_index[hostname] \u003d hostdata"},{"line_number":191,"context_line":"        self._update_update_coutner(hostdata[\u0027record_id\u0027])"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fa4U%3D","line":189,"in_reply_to":"AAAATH%2F%2Fr6s%3D","updated":"2013-10-16 13:12:02.000000000","message":"Will fix this in upcoming patch set.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":4458,"name":"Shane Wang","email":"shane.wang@intel.com","username":"shane-wang"},"change_message_id":"14afdb72e6b8e0ee71fb047fac9914b365582aeb","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self._update_main_record(host)"},{"line_number":205,"context_line":"        self._update_update_coutner(host[\u0027record_id\u0027])"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _update_update_coutner(self, record_id):"},{"line_number":208,"context_line":"        \"\"\"Update counter and create a field with update values.\"\"\""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        self.local_update_counter \u003d self.mc_client.incr(self._upd_field)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2FsPY%3D","line":207,"updated":"2013-10-11 08:29:30.000000000","message":"s/coutner/counter typo?","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"c7e1d843c0c02b92cee0515f424d4bcf57a929cc","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        self._update_main_record(host)"},{"line_number":205,"context_line":"        self._update_update_coutner(host[\u0027record_id\u0027])"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def _update_update_coutner(self, record_id):"},{"line_number":208,"context_line":"        \"\"\"Update counter and create a field with update values.\"\"\""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        self.local_update_counter \u003d self.mc_client.incr(self._upd_field)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATH%2F%2Fa4M%3D","line":207,"in_reply_to":"AAAATH%2F%2FsPY%3D","updated":"2013-10-16 13:12:02.000000000","message":"ditto","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"nova/scheduler/state_vault.py":[{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def _sync_state(self):"},{"line_number":74,"context_line":"        \"\"\"Backend health is checked here."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        The function returns True when it find a problem with backend. To do"},{"line_number":77,"context_line":"        it it checks if _local_update_count is ahead of the one in backend."},{"line_number":78,"context_line":"        This is a very bad omen if true as it basically means that backend"},{"line_number":79,"context_line":"        has crashed. Thus we need both to refill it and to keep provisioning"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Bau4%3D","line":76,"updated":"2013-11-26 11:32:14.000000000","message":"This is not true afaict - it will always return None.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def _sync_state(self):"},{"line_number":74,"context_line":"        \"\"\"Backend health is checked here."},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        The function returns True when it find a problem with backend. To do"},{"line_number":77,"context_line":"        it it checks if _local_update_count is ahead of the one in backend."},{"line_number":78,"context_line":"        This is a very bad omen if true as it basically means that backend"},{"line_number":79,"context_line":"        has crashed. Thus we need both to refill it and to keep provisioning"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZiw%3D","line":76,"in_reply_to":"AAAATn%2F%2Bau4%3D","updated":"2013-11-26 14:43:48.000000000","message":"Apparently this docstring crept in from another version. Will fix it later.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            return"},{"line_number":96,"context_line":"        last_token, states \u003d self._storage_backend.get_records_since("},{"line_number":97,"context_line":"                                                              self._last_token)"},{"line_number":98,"context_line":"        if self._last_token \u003e last_token:"},{"line_number":99,"context_line":"            self._backend_is_dead_flag \u003d sv_timedelta(now,"},{"line_number":100,"context_line":"                self._reinitialization_delay)"},{"line_number":101,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BanM%3D","line":98,"updated":"2013-11-26 11:32:14.000000000","message":"Another example of how horribly underspecified these classes and their inter-workings are - all tokens are required to be ordered where grater means later. I don\u0027t think it is a good idea to have these things implicitly introduced like this.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"db34b548a23c29432a54c9965df38cb9c80ab814","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            return"},{"line_number":96,"context_line":"        last_token, states \u003d self._storage_backend.get_records_since("},{"line_number":97,"context_line":"                                                              self._last_token)"},{"line_number":98,"context_line":"        if self._last_token \u003e last_token:"},{"line_number":99,"context_line":"            self._backend_is_dead_flag \u003d sv_timedelta(now,"},{"line_number":100,"context_line":"                self._reinitialization_delay)"},{"line_number":101,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZbs%3D","line":98,"in_reply_to":"AAAATn%2F%2BZis%3D","updated":"2013-11-26 15:02:31.000000000","message":"I don\u0027t think this is a documentation issue - it\u0027s a software design issue. You can\u0027t fix broken interactions between components by documenting them - otherwise we\u0027ll all be writing docs for our 1 million line functions instead of the code we write right now.\n\nNow I am not saying that we need to get this right 100% before we can merge the patch - but as it stands now - I don\u0027t think this is well designed software.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            return"},{"line_number":96,"context_line":"        last_token, states \u003d self._storage_backend.get_records_since("},{"line_number":97,"context_line":"                                                              self._last_token)"},{"line_number":98,"context_line":"        if self._last_token \u003e last_token:"},{"line_number":99,"context_line":"            self._backend_is_dead_flag \u003d sv_timedelta(now,"},{"line_number":100,"context_line":"                self._reinitialization_delay)"},{"line_number":101,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZis%3D","line":98,"in_reply_to":"AAAATn%2F%2BanM%3D","updated":"2013-11-26 14:43:48.000000000","message":"This seems to be another documentation issue, which are planned to be addressed later.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        for x in self._host_to_record_map.itervalues():"},{"line_number":119,"context_line":"            yield x.value"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def update(self, value):"},{"line_number":122,"context_line":"        self._sync_state()"},{"line_number":123,"context_line":"        key \u003d value.get(self._primary_key)"},{"line_number":124,"context_line":"        old_state \u003d self._host_to_record_map.get(key)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Bauc%3D","line":121,"updated":"2013-11-26 11:32:14.000000000","message":"It is almost impossible to guess how this is going to be used based on this patch alone, but after reading Boris\u0027s emails - I assume this will be called by a Scheduler worker on an rpc message from a compute host.\n\nNow I don\u0027t like the lack of atomicity in between _sync_state and put_record calls. I get that these are initiated per host, and a host is unlikely to resend it\u0027s updated to another scheduler, but these are exactly the race conditions that make distributed systems hard.\n\nNow - this comment is just a random stab. I may lack understanding of how this will actually work (but is best that I can piece together from info available). What I\u0027m really trying to say is - we need either a broader design discussion, or a more complete patch series. I fear that this approach will end up with us writing a buggy implementation of a solved problem (like for example a distributed log).","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"db34b548a23c29432a54c9965df38cb9c80ab814","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        for x in self._host_to_record_map.itervalues():"},{"line_number":119,"context_line":"            yield x.value"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def update(self, value):"},{"line_number":122,"context_line":"        self._sync_state()"},{"line_number":123,"context_line":"        key \u003d value.get(self._primary_key)"},{"line_number":124,"context_line":"        old_state \u003d self._host_to_record_map.get(key)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZZc%3D","line":121,"in_reply_to":"AAAATn%2F%2BZhE%3D","updated":"2013-11-26 15:02:31.000000000","message":"I don\u0027t understand what the phrase \u0027eventually consistency model\u0027 has to do with my complaint about the possible race condition, but I will wait patiently for documentation in hope I will learn once the documentation comes :).","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        for x in self._host_to_record_map.itervalues():"},{"line_number":119,"context_line":"            yield x.value"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def update(self, value):"},{"line_number":122,"context_line":"        self._sync_state()"},{"line_number":123,"context_line":"        key \u003d value.get(self._primary_key)"},{"line_number":124,"context_line":"        old_state \u003d self._host_to_record_map.get(key)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZhE%3D","line":121,"in_reply_to":"AAAATn%2F%2Bauc%3D","updated":"2013-11-26 14:43:48.000000000","message":"An eventually consistency model is being used here. This issue will be addressed together with other documentation issues.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _initialize(self):"},{"line_number":62,"context_line":"        \"\"\"This function creates and populates for the first time the local"},{"line_number":63,"context_line":"        state cache."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        self._storage_backend \u003d importutils.import_object(CONF.storage_backend,"},{"line_number":66,"context_line":"                                self._namespace)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSLM%3D","line":63,"updated":"2013-11-27 21:33:41.000000000","message":"\"\"\"Create and populate the local state cache for first time use.\"\"\"\n\nwill fit on one line per PEP257.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _initialize(self):"},{"line_number":62,"context_line":"        \"\"\"This function creates and populates for the first time the local"},{"line_number":63,"context_line":"        state cache."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        self._storage_backend \u003d importutils.import_object(CONF.storage_backend,"},{"line_number":66,"context_line":"                                self._namespace)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMfQ%3D","line":63,"in_reply_to":"AAAATn%2F%2BSLM%3D","updated":"2013-11-29 11:28:59.000000000","message":"Thank you, I\u0027ll reword the docstring.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":132,"context_line":"class StorageBackend(object):"},{"line_number":133,"context_line":"    \"\"\"This class provides interface for actual bacend and several high-level"},{"line_number":134,"context_line":"    functions to support it."},{"line_number":135,"context_line":"    \"\"\""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def __init__(self, namespace):"},{"line_number":138,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSKw%3D","line":135,"updated":"2013-11-27 21:33:41.000000000","message":"\"\"\"Interface that vault storage backends must implement.\"\"\"","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":132,"context_line":"class StorageBackend(object):"},{"line_number":133,"context_line":"    \"\"\"This class provides interface for actual bacend and several high-level"},{"line_number":134,"context_line":"    functions to support it."},{"line_number":135,"context_line":"    \"\"\""},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def __init__(self, namespace):"},{"line_number":138,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMfM%3D","line":135,"in_reply_to":"AAAATn%2F%2BSKw%3D","updated":"2013-11-29 11:28:59.000000000","message":"Done","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def get_records_since(self, token):"},{"line_number":145,"context_line":"        \"\"\"This function returns all records starting with the one having"},{"line_number":146,"context_line":"        specified token."},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        raise NotImplementedError()"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSKo%3D","line":146,"updated":"2013-11-27 21:33:41.000000000","message":"\"\"\"Return all records starting with token.\n\nIf no record has token XXX will happen.\n\"\"\"\n\nI don\u0027t know what XXX will be, but it should be specified, or we should say \u0027\u003e\u003d\u0027 rather than \u0027\u003d\u003d\u0027 or something.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def get_records_since(self, token):"},{"line_number":145,"context_line":"        \"\"\"This function returns all records starting with the one having"},{"line_number":146,"context_line":"        specified token."},{"line_number":147,"context_line":"        \"\"\""},{"line_number":148,"context_line":"        raise NotImplementedError()"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMds%3D","line":146,"in_reply_to":"AAAATn%2F%2BSKo%3D","updated":"2013-11-29 11:28:59.000000000","message":"If no record has this token it basically means that Synchronizer is ahead of backend, and that can happen only if a backend failure has occured. And it is Synchronizer\u0027s job to handle such cases. Also we actually read all records with id greater than token. I\u0027ll fix the docstring to reflect this.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def purge_outdated_data(timedelta):"},{"line_number":154,"context_line":"        \"\"\"This function purges every entry older than timestamp."},{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSKk%3D","line":155,"updated":"2013-11-27 21:33:41.000000000","message":"Move the \"\"\" onto the same line (pep257)","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def purge_outdated_data(timedelta):"},{"line_number":154,"context_line":"        \"\"\"This function purges every entry older than timestamp."},{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMfI%3D","line":155,"in_reply_to":"AAAATn%2F%2BSKk%3D","updated":"2013-11-29 11:28:59.000000000","message":"Done","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                     self._entry_expiration_time)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def get_all(self):"},{"line_number":147,"context_line":"        \"\"\"Returns all hos states.\"\"\""},{"line_number":148,"context_line":"        self._sync_state()"},{"line_number":149,"context_line":"        for x in self._host_to_record_map.itervalues():"},{"line_number":150,"context_line":"            yield x.value"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91uA%3D","line":147,"updated":"2013-12-05 11:33:35.000000000","message":"hos  \u003d\u003e host","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                     self._entry_expiration_time)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def get_all(self):"},{"line_number":147,"context_line":"        \"\"\"Returns all hos states.\"\"\""},{"line_number":148,"context_line":"        self._sync_state()"},{"line_number":149,"context_line":"        for x in self._host_to_record_map.itervalues():"},{"line_number":150,"context_line":"            yield x.value"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91ag%3D","line":147,"in_reply_to":"AAAATn%2F91uA%3D","updated":"2013-12-05 13:24:23.000000000","message":"Done","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        self._storage_backend.remove_record(record.record_id)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class StorageBackend(object):"},{"line_number":172,"context_line":"    \"\"\"Interface that vault storage backends must implementi.\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def __init__(self, namespace):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91t0%3D","line":171,"updated":"2013-12-05 11:33:35.000000000","message":"I think that this should be in a separate file","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        self._storage_backend.remove_record(record.record_id)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class StorageBackend(object):"},{"line_number":172,"context_line":"    \"\"\"Interface that vault storage backends must implementi.\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def __init__(self, namespace):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91ZM%3D","line":171,"in_reply_to":"AAAATn%2F91t0%3D","updated":"2013-12-05 13:24:23.000000000","message":"Will it improve logic structure of code much? I\u0027ll think of it, but I propose to leave things as is for now.","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class StorageBackend(object):"},{"line_number":172,"context_line":"    \"\"\"Interface that vault storage backends must implementi.\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def __init__(self, namespace):"},{"line_number":175,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91t4%3D","line":172,"updated":"2013-12-05 11:33:35.000000000","message":"implementi \u003d\u003e implement","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"class StorageBackend(object):"},{"line_number":172,"context_line":"    \"\"\"Interface that vault storage backends must implementi.\"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def __init__(self, namespace):"},{"line_number":175,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91aE%3D","line":172,"in_reply_to":"AAAATn%2F91t4%3D","updated":"2013-12-05 13:24:23.000000000","message":"Done","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"f56e13438e4a4bfd98249b4a91f6c691c6cf6bad","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        if self._entry_expiration_time \u003e 0:"},{"line_number":141,"context_line":"            now \u003d sv_now()"},{"line_number":142,"context_line":"            if sv_timedelta(self._last_purge_time,"},{"line_number":143,"context_line":"                    self._entry_expiration_time) \u003c now:"},{"line_number":144,"context_line":"                self._last_purge_time \u003d now"},{"line_number":145,"context_line":"                self._storage_backend.purge_outdated_data("}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F90Nw%3D","line":142,"updated":"2013-12-05 16:26:17.000000000","message":"Unreadable. I think it is possible to declare extra variable with sv_timedelta(self._last_purge_time, self._entry_expiration_time) result.","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"75b04278fd7ae9fe7bcd79d347a8d17781ecd3ef","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        if self._entry_expiration_time \u003e 0:"},{"line_number":141,"context_line":"            now \u003d sv_now()"},{"line_number":142,"context_line":"            if sv_timedelta(self._last_purge_time,"},{"line_number":143,"context_line":"                    self._entry_expiration_time) \u003c now:"},{"line_number":144,"context_line":"                self._last_purge_time \u003d now"},{"line_number":145,"context_line":"                self._storage_backend.purge_outdated_data("}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F9wyA%3D","line":142,"in_reply_to":"AAAATn%2F90Nw%3D","updated":"2013-12-06 09:00:51.000000000","message":"I think I\u0027d better leave this call inlined. But I agree that it is aligned badly and I\u0027ll  fix that.","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"f56e13438e4a4bfd98249b4a91f6c691c6cf6bad","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        self._sync_state()"},{"line_number":157,"context_line":"        key \u003d value.get(self._primary_key)"},{"line_number":158,"context_line":"        old_state \u003d self._host_to_record_map.get(key)"},{"line_number":159,"context_line":"        if old_state is None:"},{"line_number":160,"context_line":"            record_id \u003d None"},{"line_number":161,"context_line":"        else:"},{"line_number":162,"context_line":"            record_id \u003d old_state.record_id"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F90MY%3D","line":159,"updated":"2013-12-05 16:26:17.000000000","message":"Could be ternary. But it is OK with if statement.","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"75b04278fd7ae9fe7bcd79d347a8d17781ecd3ef","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        self._sync_state()"},{"line_number":157,"context_line":"        key \u003d value.get(self._primary_key)"},{"line_number":158,"context_line":"        old_state \u003d self._host_to_record_map.get(key)"},{"line_number":159,"context_line":"        if old_state is None:"},{"line_number":160,"context_line":"            record_id \u003d None"},{"line_number":161,"context_line":"        else:"},{"line_number":162,"context_line":"            record_id \u003d old_state.record_id"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F9wy4%3D","line":159,"in_reply_to":"AAAATn%2F90MY%3D","updated":"2013-12-06 09:00:51.000000000","message":"Leat us leave it as it is then.","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"f56e13438e4a4bfd98249b4a91f6c691c6cf6bad","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class StorageBackend(object):"},{"line_number":174,"context_line":"    \"\"\"Interface that vault storage backends must implement.\"\"\""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def __init__(self, namespace):"},{"line_number":177,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F90LU%3D","line":174,"updated":"2013-12-05 16:26:17.000000000","message":"If it is must implement then please declare the class with ABCMeta metaclass and abstract methods.","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"75b04278fd7ae9fe7bcd79d347a8d17781ecd3ef","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class StorageBackend(object):"},{"line_number":174,"context_line":"    \"\"\"Interface that vault storage backends must implement.\"\"\""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def __init__(self, namespace):"},{"line_number":177,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAATn%2F9wys%3D","line":174,"in_reply_to":"AAAATn%2F90LU%3D","updated":"2013-12-06 09:00:51.000000000","message":"Good point, thank you.","commit_id":"47b27fd52806fe115cb2535cc035e6159de9140f"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"d819cd3f85f46db3c583ca2812858c70e1176eb3","unresolved":false,"context_lines":[{"line_number":174,"context_line":"class StorageBackend(object):"},{"line_number":175,"context_line":"    \"\"\"Interface that vault storage backends must implement.\"\"\""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def __init__(self, namespace):"},{"line_number":180,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAATn%2F9wrk%3D","line":177,"updated":"2013-12-06 09:11:48.000000000","message":"Due to Py3 compatibility requirements, please see http://pythonhosted.org/six/#six.add_metaclass","commit_id":"e307f17db6ced2951fc00daac3fc5b7a40ca0676"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"4b2491a28a62a9114a4f505fd9666c40fed91534","unresolved":false,"context_lines":[{"line_number":174,"context_line":"class StorageBackend(object):"},{"line_number":175,"context_line":"    \"\"\"Interface that vault storage backends must implement.\"\"\""},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def __init__(self, namespace):"},{"line_number":180,"context_line":"        self._create_namespace(namespace)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAATn%2F9wgw%3D","line":177,"in_reply_to":"AAAATn%2F9wrk%3D","updated":"2013-12-06 09:59:24.000000000","message":"Done","commit_id":"e307f17db6ced2951fc00daac3fc5b7a40ca0676"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"bcd0b3e16e79195dd25fe9b840bb78c0962ed5aa","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    cfg.StrOpt(\u0027default_namespace\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027nova\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published this states.\u0027),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027primary_key\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027hostname\u0027,"},{"line_number":53,"context_line":"               help\u003d\u0027Default primary key for namespace. This entry will be\u0027"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAATn%2F9wDI%3D","line":50,"updated":"2013-12-06 12:11:32.000000000","message":"Since this is very specifically for host state being used by the scheduler I think we may come to regret using such a general name as \"nova\" here\".    How about something ore specific like \"nova-hoststate\"","commit_id":"ea3b42ac3e5b3cf2564738888ad6ce4f576a1bfe"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"1e9460b438b4b573c4f47568563fb7c3baaa2a21","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    cfg.StrOpt(\u0027default_namespace\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027nova\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published this states.\u0027),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027primary_key\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027hostname\u0027,"},{"line_number":53,"context_line":"               help\u003d\u0027Default primary key for namespace. This entry will be\u0027"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAATn%2F9v94%3D","line":50,"in_reply_to":"AAAATn%2F9wDI%3D","updated":"2013-12-06 12:28:01.000000000","message":"Well, yes, the name is quite general, but it is an option which may be overriden. Also it has rather small scope so it should not be a problem, but I think I\u0027ll follow your suggestion anyway.","commit_id":"ea3b42ac3e5b3cf2564738888ad6ce4f576a1bfe"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"bcd0b3e16e79195dd25fe9b840bb78c0962ed5aa","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \"\"\"Synchronizes local host states with storage backend."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        The function checks if there is a problem with backend. To do"},{"line_number":110,"context_line":"        it it compares _local_update_count with update counter stored at"},{"line_number":111,"context_line":"        the backend. If local counter is less or equal to the one in the"},{"line_number":112,"context_line":"        backend no problem is detected and all updates that are newer"},{"line_number":113,"context_line":"        then the last one obtained are read from backend and applied to"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAATn%2F9wDA%3D","line":110,"updated":"2013-12-06 12:11:32.000000000","message":"Nit \"... to do that it ...\"","commit_id":"ea3b42ac3e5b3cf2564738888ad6ce4f576a1bfe"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"1e9460b438b4b573c4f47568563fb7c3baaa2a21","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        \"\"\"Synchronizes local host states with storage backend."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        The function checks if there is a problem with backend. To do"},{"line_number":110,"context_line":"        it it compares _local_update_count with update counter stored at"},{"line_number":111,"context_line":"        the backend. If local counter is less or equal to the one in the"},{"line_number":112,"context_line":"        backend no problem is detected and all updates that are newer"},{"line_number":113,"context_line":"        then the last one obtained are read from backend and applied to"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAATn%2F9v%2F4%3D","line":110,"in_reply_to":"AAAATn%2F9wDA%3D","updated":"2013-12-06 12:28:01.000000000","message":"Done","commit_id":"ea3b42ac3e5b3cf2564738888ad6ce4f576a1bfe"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"afeaad6a70800b55e49d89236bf4a8eca8698173","unresolved":false,"context_lines":[{"line_number":25,"context_line":"The main purpose of StorageBackend is to provide uniform access to an entity"},{"line_number":26,"context_line":"that is capable of storing incremental updates. New hoststates propagate"},{"line_number":27,"context_line":"as changes to exising ones. Either a database or a distributed cache may be"},{"line_number":28,"context_line":"used as such backend."},{"line_number":29,"context_line":"\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"import abc"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAATn%2F9cRM%3D","line":28,"updated":"2013-12-11 14:00:35.000000000","message":"Feels like there is some text or logic missing here about how such a store gets populated from the start ?","commit_id":"b81e466961df40e00312b7d7046392fec68d933e"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b5a6c3de75febdef88c3c08d7cd789d77158abea","unresolved":false,"context_lines":[{"line_number":25,"context_line":"The main purpose of StorageBackend is to provide uniform access to an entity"},{"line_number":26,"context_line":"that is capable of storing incremental updates. New hoststates propagate"},{"line_number":27,"context_line":"as changes to exising ones. Either a database or a distributed cache may be"},{"line_number":28,"context_line":"used as such backend."},{"line_number":29,"context_line":"\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"import abc"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAATn%2F9XBI%3D","line":28,"in_reply_to":"AAAATn%2F9cRM%3D","updated":"2013-12-12 09:33:35.000000000","message":"Well, at the very beginning it is empty, but as soon as a node appears in the cloud it starts sending its state to Synchronizers, which fill the backend. So a new cloud requires some warm-up time, but it is rather short, normally around one minute.","commit_id":"b81e466961df40e00312b7d7046392fec68d933e"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"afeaad6a70800b55e49d89236bf4a8eca8698173","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        crashed the fallback plan is:"},{"line_number":118,"context_line":"            -- to set up a timer for host indexes reinitialization start;"},{"line_number":119,"context_line":"            -- to use host states from local cache till the timer expires;"},{"line_number":120,"context_line":"            -- reinitialize self when the timer expires."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        After state synchronization is over outdated updates (those"},{"line_number":123,"context_line":"        which exist for longer _entry_expiration_time) are purged."}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAATn%2F9cR4%3D","line":120,"updated":"2013-12-11 14:00:35.000000000","message":"How does this cope with multiple schedulers each detecting that the back end has failed, and having potentially different sets of data that need to be used for refill ?","commit_id":"b81e466961df40e00312b7d7046392fec68d933e"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"b5a6c3de75febdef88c3c08d7cd789d77158abea","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        crashed the fallback plan is:"},{"line_number":118,"context_line":"            -- to set up a timer for host indexes reinitialization start;"},{"line_number":119,"context_line":"            -- to use host states from local cache till the timer expires;"},{"line_number":120,"context_line":"            -- reinitialize self when the timer expires."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        After state synchronization is over outdated updates (those"},{"line_number":123,"context_line":"        which exist for longer _entry_expiration_time) are purged."}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAATn%2F9XDE%3D","line":120,"in_reply_to":"AAAATn%2F9cR4%3D","updated":"2013-12-12 09:33:35.000000000","message":"_sync_state()\u0027s purpose is to update local state. It gets called each time any request conserning host states appears. In case backend dies local cache is used for providing data to read operations, but write operation still propagate to the backend as normally, so when it gets ressurrected host states start to fill in. The reinitialization timer starts when backend is found up and running. Default reinitialization delay is set equal to the default update interval to make sure that when reinitialization takes place all hosts have already sent updates to the storage backend. To put it short schedulers don\u0027t use old data to refill the backend, but update it only whith fresh states.\n\nhttps://etherpad.openstack.org/p/scheduler-design-proposal -- here a bit more detailed description of our approach could be found. I\u0027ll add this behaviour description to the docstring in one of the next patch sets.","commit_id":"b81e466961df40e00312b7d7046392fec68d933e"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":19,"context_line":"supposed that Synchronizer class is instantiated by scheduler and by conductor"},{"line_number":20,"context_line":"and all host states are stored in it. This allows for very fast and efficient"},{"line_number":21,"context_line":"host state acquisition and handling as it requires no more to extract all"},{"line_number":22,"context_line":"host states from database and transfer them over network."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"In order to share host state data with other schedulers StorageBackend is used."},{"line_number":25,"context_line":"The main purpose of StorageBackend is to provide uniform access to an entity"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FyNg%3D","line":22,"updated":"2014-01-08 15:49:08.000000000","message":"Nit: For readability, suggest changing 21-22 to:\n\nretrieval of host state as it removes the need to consult the database.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":19,"context_line":"supposed that Synchronizer class is instantiated by scheduler and by conductor"},{"line_number":20,"context_line":"and all host states are stored in it. This allows for very fast and efficient"},{"line_number":21,"context_line":"host state acquisition and handling as it requires no more to extract all"},{"line_number":22,"context_line":"host states from database and transfer them over network."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"In order to share host state data with other schedulers StorageBackend is used."},{"line_number":25,"context_line":"The main purpose of StorageBackend is to provide uniform access to an entity"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2Ftrw%3D","line":22,"in_reply_to":"AAAAUH%2F%2FyNg%3D","updated":"2014-01-09 12:06:18.000000000","message":"Thank you, this sounds much better indeed.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":24,"context_line":"In order to share host state data with other schedulers StorageBackend is used."},{"line_number":25,"context_line":"The main purpose of StorageBackend is to provide uniform access to an entity"},{"line_number":26,"context_line":"that is capable of storing incremental updates. New hoststates propagate"},{"line_number":27,"context_line":"as changes to exising ones. Either a database or a distributed cache may be"},{"line_number":28,"context_line":"used as such backend."},{"line_number":29,"context_line":"\"\"\""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FyNE%3D","line":27,"updated":"2014-01-08 15:49:08.000000000","message":"typo: existing","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":24,"context_line":"In order to share host state data with other schedulers StorageBackend is used."},{"line_number":25,"context_line":"The main purpose of StorageBackend is to provide uniform access to an entity"},{"line_number":26,"context_line":"that is capable of storing incremental updates. New hoststates propagate"},{"line_number":27,"context_line":"as changes to exising ones. Either a database or a distributed cache may be"},{"line_number":28,"context_line":"used as such backend."},{"line_number":29,"context_line":"\"\"\""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2Ftrk%3D","line":27,"in_reply_to":"AAAAUH%2F%2FyNE%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"bc46d8f16f7b28c51101c88776c7d8a7bed9d456","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               \u0027 last seen till state vault reinitialization.\u0027),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF.register_opts(synchronizer_options)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"record_tuple \u003d collections.namedtuple(\u0027record_tuple\u0027, [\u0027record_id\u0027, \u0027value\u0027])"},{"line_number":69,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAT3%2F%2F1po%3D","line":66,"updated":"2013-12-30 12:32:36.000000000","message":"is it worth considering putting these under a scheduling section?","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               \u0027 last seen till state vault reinitialization.\u0027),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF.register_opts(synchronizer_options)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"record_tuple \u003d collections.namedtuple(\u0027record_tuple\u0027, [\u0027record_id\u0027, \u0027value\u0027])"},{"line_number":69,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FxyU%3D","line":66,"in_reply_to":"AAAAT3%2F%2F1po%3D","updated":"2014-01-08 15:49:08.000000000","message":"+1: without context, it would be hard to know what \"default_namespace\" or \"primary_key\" refer to","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               \u0027 last seen till state vault reinitialization.\u0027),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF.register_opts(synchronizer_options)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"record_tuple \u003d collections.namedtuple(\u0027record_tuple\u0027, [\u0027record_id\u0027, \u0027value\u0027])"},{"line_number":69,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtnQ%3D","line":66,"in_reply_to":"AAAAUH%2F%2FxyU%3D","updated":"2014-01-09 12:06:18.000000000","message":"Good point, I\u0027ll think of it. As far as I understand it now one either won\u0027t see these options and will be satisfied with defaults or he\u0027ll know what they are needed for and thus will have the context. Probably a bit more descriptive names should be used here.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        The function checks if there is a problem with backend. To do that it"},{"line_number":108,"context_line":"        compares _last_token with token stored at the backend (now update"},{"line_number":109,"context_line":"        counter serves as a token).  If local token is less then the one in"},{"line_number":110,"context_line":"        the backend no problem is detected. All updates that are newer"},{"line_number":111,"context_line":"        then the last obtained token are read from backend and applied to"},{"line_number":112,"context_line":"        local storage. If the local token is greater then the one in the"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FyFk%3D","line":109,"updated":"2014-01-08 15:49:08.000000000","message":"then -\u003e than or equal to\n\nNits: You\u0027ve said \u0027then\u0027 when you should say \u0027than\u0027 a few other times in this para. Not a huge deal but since you\u0027ll be updating anyway.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        The function checks if there is a problem with backend. To do that it"},{"line_number":108,"context_line":"        compares _last_token with token stored at the backend (now update"},{"line_number":109,"context_line":"        counter serves as a token).  If local token is less then the one in"},{"line_number":110,"context_line":"        the backend no problem is detected. All updates that are newer"},{"line_number":111,"context_line":"        then the last obtained token are read from backend and applied to"},{"line_number":112,"context_line":"        local storage. If the local token is greater then the one in the"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtTo%3D","line":109,"in_reply_to":"AAAAUH%2F%2FyFk%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            -- to use frozen copy during specified timeout."},{"line_number":118,"context_line":"            -- to reset master copy to initial state and refill it during"},{"line_number":119,"context_line":"            timeout."},{"line_number":120,"context_line":"            -- when timeout is over switch back to the master copy."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        The last phase of state synchronization consists of purging outdated"},{"line_number":123,"context_line":"        updates (those which exist for longer than _entry_expiration_time)."}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2Fx9U%3D","line":120,"updated":"2014-01-08 15:49:08.000000000","message":"To allay the fears of recovery-paranoid people like me, would you consider adding something like this please?\n\nAs this plan plays out, some records may be lost. Fortunately this is unimportant as the compute nodes will shortly supply new, accurate records.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            -- to use frozen copy during specified timeout."},{"line_number":118,"context_line":"            -- to reset master copy to initial state and refill it during"},{"line_number":119,"context_line":"            timeout."},{"line_number":120,"context_line":"            -- when timeout is over switch back to the master copy."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        The last phase of state synchronization consists of purging outdated"},{"line_number":123,"context_line":"        updates (those which exist for longer than _entry_expiration_time)."}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtTc%3D","line":120,"in_reply_to":"AAAAUH%2F%2Fx9U%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @abc.abstractmethod"},{"line_number":194,"context_line":"    def get_records_since(self, token):"},{"line_number":195,"context_line":"        \"\"\"Returns all records wich have ids greater then specified token.\"\"\""},{"line_number":196,"context_line":"        return"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2Fx5Y%3D","line":195,"updated":"2014-01-08 15:49:08.000000000","message":"typos: which, than","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    @abc.abstractmethod"},{"line_number":194,"context_line":"    def get_records_since(self, token):"},{"line_number":195,"context_line":"        \"\"\"Returns all records wich have ids greater then specified token.\"\"\""},{"line_number":196,"context_line":"        return"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtTY%3D","line":195,"in_reply_to":"AAAAUH%2F%2Fx5Y%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    @abc.abstractmethod"},{"line_number":209,"context_line":"    def remove_record(self, record_id):"},{"line_number":210,"context_line":"        \"\"\"This function purges every entry older than timestamp.\"\"\""},{"line_number":211,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2Fx5Q%3D","line":210,"updated":"2014-01-08 15:49:08.000000000","message":"Copy-paste error? I\u0027d not even comment, myself, the purpose is obvious","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    @abc.abstractmethod"},{"line_number":209,"context_line":"    def remove_record(self, record_id):"},{"line_number":210,"context_line":"        \"\"\"This function purges every entry older than timestamp.\"\"\""},{"line_number":211,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtSc%3D","line":210,"in_reply_to":"AAAAUH%2F%2Fx5Q%3D","updated":"2014-01-09 12:06:18.000000000","message":"Yes, I\u0027ve copy-pasted it form the previous function. I prefere to keep the comment, just in case someone someday decides it is not obvious.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"64d48fa527949800ccf2a086ff2541e97fea9e1d","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CONF \u003d cfg.CONF"},{"line_number":42,"context_line":"synchronizer_options \u003d ["},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027storage_backend\u0027,"},{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2FExE%3D","line":43,"updated":"2014-01-17 17:41:52.000000000","message":"Seems like a very generic name for something that is only related to the state store in the scheduler, esp as this options are not registered as part of a group.   Would prefer something like\n\nscheduler_state_storage_backend","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"84935190d74dde46df8152148efed15299753d1a","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CONF \u003d cfg.CONF"},{"line_number":42,"context_line":"synchronizer_options \u003d ["},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027storage_backend\u0027,"},{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2Bwgg%3D","line":43,"in_reply_to":"AAAAUH%2F%2FExE%3D","updated":"2014-01-22 13:06:28.000000000","message":"Please see my comment at line 65.","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"64d48fa527949800ccf2a086ff2541e97fea9e1d","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"},{"line_number":47,"context_line":"    cfg.StrOpt(\u0027default_namespace\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2FEvY%3D","line":47,"updated":"2014-01-17 17:41:52.000000000","message":"As above","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"84935190d74dde46df8152148efed15299753d1a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"},{"line_number":47,"context_line":"    cfg.StrOpt(\u0027default_namespace\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2Bwgc%3D","line":47,"in_reply_to":"AAAAUH%2F%2FEvY%3D","updated":"2014-01-22 13:06:28.000000000","message":"Please see my comment at line 65.","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"64d48fa527949800ccf2a086ff2541e97fea9e1d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027primary_key\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027hypervisor_hostname\u0027,"},{"line_number":53,"context_line":"               help\u003d\u0027Default primary key for namespace. This entry will be\u0027"},{"line_number":54,"context_line":"               \u0027 used to store state identifier.\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2FEvU%3D","line":51,"updated":"2014-01-17 17:41:52.000000000","message":"As above","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"84935190d74dde46df8152148efed15299753d1a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027primary_key\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027hypervisor_hostname\u0027,"},{"line_number":53,"context_line":"               help\u003d\u0027Default primary key for namespace. This entry will be\u0027"},{"line_number":54,"context_line":"               \u0027 used to store state identifier.\u0027),"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2BwgY%3D","line":51,"in_reply_to":"AAAAUH%2F%2FEvU%3D","updated":"2014-01-22 13:06:28.000000000","message":"Please see my comment at line 65.","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"64d48fa527949800ccf2a086ff2541e97fea9e1d","unresolved":false,"context_lines":[{"line_number":62,"context_line":"               \u0027 last seen till state vault reinitialization.\u0027),"},{"line_number":63,"context_line":"]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"CONF.register_opts(synchronizer_options)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"record_tuple \u003d collections.namedtuple(\u0027record_tuple\u0027, [\u0027record_id\u0027, \u0027value\u0027])"},{"line_number":68,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2FEvg%3D","line":65,"updated":"2014-01-17 17:41:52.000000000","message":"If you added \"group\u003d\u0027scheduler-state\"  I\u0027d be less concerned about the individual names","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"84935190d74dde46df8152148efed15299753d1a","unresolved":false,"context_lines":[{"line_number":62,"context_line":"               \u0027 last seen till state vault reinitialization.\u0027),"},{"line_number":63,"context_line":"]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"CONF.register_opts(synchronizer_options)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"record_tuple \u003d collections.namedtuple(\u0027record_tuple\u0027, [\u0027record_id\u0027, \u0027value\u0027])"},{"line_number":68,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2Bwho%3D","line":65,"in_reply_to":"AAAAUH%2F%2FEvg%3D","updated":"2014-01-22 13:06:28.000000000","message":"I\u0027ll add a group \u0027state_synchronizer\u0027 to provide context for all options defined here. I think this shoud suffice, but if not I\u0027ll rename the options.","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"64d48fa527949800ccf2a086ff2541e97fea9e1d","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class Synchronizer(object):"},{"line_number":80,"context_line":"    \"\"\"Maintains host states in actual state.\"\"\""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def __init__(self, namespace\u003dNone, primary_key\u003dNone,"},{"line_number":83,"context_line":"                 entry_expiration_time\u003dNone):"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2FEug%3D","line":80,"updated":"2014-01-17 17:41:52.000000000","message":"As a description this really doesn\u0027t describe anything meanignful","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"84935190d74dde46df8152148efed15299753d1a","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class Synchronizer(object):"},{"line_number":80,"context_line":"    \"\"\"Maintains host states in actual state.\"\"\""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def __init__(self, namespace\u003dNone, primary_key\u003dNone,"},{"line_number":83,"context_line":"                 entry_expiration_time\u003dNone):"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAUH%2F%2Bwhc%3D","line":80,"in_reply_to":"AAAAUH%2F%2FEug%3D","updated":"2014-01-22 13:06:28.000000000","message":"I\u0027ll expand it.","commit_id":"50d3473a77eb16c4957c76ef8c1078575ee8a188"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"2f20b8a721b18db40b67b5dee6f768323854dba1","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CONF \u003d cfg.CONF"},{"line_number":42,"context_line":"synchronizer_options \u003d ["},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027storage_backend\u0027,"},{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2B14Q%3D","line":43,"updated":"2014-01-21 14:43:51.000000000","message":"Seems like a very generic name for something that is only related to the state store in the scheduler, esp as this options are not registered as part of a group. Would prefer something like:  scheduler_state_storage_backend","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"2eb1f0bbbfca4ddaa3b930836d6278e9099387a3","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"CONF \u003d cfg.CONF"},{"line_number":42,"context_line":"synchronizer_options \u003d ["},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027storage_backend\u0027,"},{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2Bwf8%3D","line":43,"in_reply_to":"AAAAUH%2F%2B14Q%3D","updated":"2014-01-22 13:07:34.000000000","message":"I\u0027ll add a group to contain these options.","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"2f20b8a721b18db40b67b5dee6f768323854dba1","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"},{"line_number":47,"context_line":"    cfg.StrOpt(\u0027default_namespace\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2B13c%3D","line":47,"updated":"2014-01-21 14:43:51.000000000","message":"as above","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"2eb1f0bbbfca4ddaa3b930836d6278e9099387a3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"               default\u003d\u0027nova.scheduler.vault_backends.mysql.\u0027"},{"line_number":45,"context_line":"                       \u0027MySQL_Synchronizer\u0027,"},{"line_number":46,"context_line":"               help\u003d\u0027Default backend class.\u0027),"},{"line_number":47,"context_line":"    cfg.StrOpt(\u0027default_namespace\u0027,"},{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2Bwf4%3D","line":47,"in_reply_to":"AAAAUH%2F%2B13c%3D","updated":"2014-01-22 13:07:34.000000000","message":"Please see my comment at line 43.","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"2f20b8a721b18db40b67b5dee6f768323854dba1","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027primary_key\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027hypervisor_hostname\u0027,"},{"line_number":53,"context_line":"               help\u003d\u0027Default primary key for namespace. This entry will be\u0027"},{"line_number":54,"context_line":"               \u0027 used to store state identifier.\u0027),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2B13g%3D","line":51,"updated":"2014-01-21 14:43:51.000000000","message":"as above","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"2eb1f0bbbfca4ddaa3b930836d6278e9099387a3","unresolved":false,"context_lines":[{"line_number":48,"context_line":"               default\u003d\u0027nova-hoststate\u0027,"},{"line_number":49,"context_line":"               help\u003d\u0027Default namespace to use. Namespaces indicate which\u0027"},{"line_number":50,"context_line":"               \u0027 service has published these states.\u0027),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027primary_key\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027hypervisor_hostname\u0027,"},{"line_number":53,"context_line":"               help\u003d\u0027Default primary key for namespace. This entry will be\u0027"},{"line_number":54,"context_line":"               \u0027 used to store state identifier.\u0027),"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2Bwf0%3D","line":51,"in_reply_to":"AAAAUH%2F%2B13g%3D","updated":"2014-01-22 13:07:34.000000000","message":"Please see my comment at line 43.","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"2f20b8a721b18db40b67b5dee6f768323854dba1","unresolved":false,"context_lines":[{"line_number":62,"context_line":"               \u0027 last seen till state vault reinitialization.\u0027),"},{"line_number":63,"context_line":"]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"CONF.register_opts(synchronizer_options)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"record_tuple \u003d collections.namedtuple(\u0027record_tuple\u0027, [\u0027record_id\u0027, \u0027value\u0027])"},{"line_number":68,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2B13k%3D","line":65,"updated":"2014-01-21 14:43:51.000000000","message":"If you added \"group\u003d\u0027scheduler-state\" so that these are constrained to a specific block in the config file I\u0027d be less concerned about the individual names being so generic","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"2eb1f0bbbfca4ddaa3b930836d6278e9099387a3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"               \u0027 last seen till state vault reinitialization.\u0027),"},{"line_number":63,"context_line":"]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"CONF.register_opts(synchronizer_options)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"record_tuple \u003d collections.namedtuple(\u0027record_tuple\u0027, [\u0027record_id\u0027, \u0027value\u0027])"},{"line_number":68,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":42,"id":"AAAAUH%2F%2Bwfo%3D","line":65,"in_reply_to":"AAAAUH%2F%2B13k%3D","updated":"2014-01-22 13:07:34.000000000","message":"Please see my comment at line 43.","commit_id":"314fcc968c14740979aea5f64c2204d348178173"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"67cf73bebf5b4d72a1436304f4e2ca8825fdafe3","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        updates (those which exist for longer than _entry_expiration_time)."},{"line_number":134,"context_line":"        \"\"\""},{"line_number":135,"context_line":"        now \u003d sv_now()"},{"line_number":136,"context_line":"        if self._backend_is_dead_flag is not None:"},{"line_number":137,"context_line":"            if now \u003e self._backend_is_dead_flag:"},{"line_number":138,"context_line":"                self._backend_is_dead_flag \u003d None"},{"line_number":139,"context_line":"                self._last_valid_host_map \u003d {}"}],"source_content_type":"text/x-python","patch_set":71,"id":"7adec928_19f12e02","line":136,"updated":"2014-05-16 14:12:15.000000000","message":"Dead backend that died and then spun back up losing all of their state is something that makes sense for some backends (memcached) and not that much sense for persistent backends (mysql). So I\u0027d challenge that this belongs in the synchronizer class and move it to the storage backend?","commit_id":"694f7e53cfa81149fa549af6dc8581272720227f"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"67cf73bebf5b4d72a1436304f4e2ca8825fdafe3","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        for host in host_map.itervalues():"},{"line_number":169,"context_line":"            yield host.value"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def update(self, value):"},{"line_number":172,"context_line":"        \"\"\"Updates or creates host state record.\"\"\""},{"line_number":173,"context_line":"        self._sync_state()"},{"line_number":174,"context_line":"        key \u003d value.get(self._primary_key)"}],"source_content_type":"text/x-python","patch_set":71,"id":"7adec928_39f26a06","line":171,"updated":"2014-05-16 14:12:15.000000000","message":"Not a big issue for me really but since update and get_ are called from different places (conductor and scheduler) maybe they should be in different classes ?\n\nA minor nit really I don\u0027t mind if it stays like this tho","commit_id":"694f7e53cfa81149fa549af6dc8581272720227f"}],"nova/scheduler/vault_backends/memcache.py":[{"author":{"_account_id":7624,"name":"Herman Narkaytis","email":"hnarkaytis@mirantis.com","username":"hnarkaytis"},"change_message_id":"7a9cacc1c9a3dd497a37e63ce6e07c159cc22b3f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        for ns_id, ns in namespaces.iteritems():"},{"line_number":62,"context_line":"            if ns \u003d\u003d self._namespace:"},{"line_number":63,"context_line":"                self._namespace_id \u003d long(ns_id)"},{"line_number":64,"context_line":"                import q"},{"line_number":65,"context_line":"                q(self._namespace, self._namespace_id)"},{"line_number":66,"context_line":"                return"},{"line_number":67,"context_line":"        namespace_count \u003d self.mc_client.incr(self._namespace_count)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BbMI%3D","line":64,"updated":"2013-11-26 09:11:40.000000000","message":"need to cleanup debug code","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8d0a0e024926604562f69c3dbf86df089e55ad53","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        for ns_id, ns in namespaces.iteritems():"},{"line_number":62,"context_line":"            if ns \u003d\u003d self._namespace:"},{"line_number":63,"context_line":"                self._namespace_id \u003d long(ns_id)"},{"line_number":64,"context_line":"                import q"},{"line_number":65,"context_line":"                q(self._namespace, self._namespace_id)"},{"line_number":66,"context_line":"                return"},{"line_number":67,"context_line":"        namespace_count \u003d self.mc_client.incr(self._namespace_count)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Ba8s%3D","line":64,"in_reply_to":"AAAATn%2F%2BbMI%3D","updated":"2013-11-26 10:14:53.000000000","message":"Done","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class MC_Synchronizer(state_vault.StorageBackend):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    _update_count \u003d \u0027update_count\u0027"},{"line_number":34,"context_line":"    _update_lower_bound \u003d \u0027update_lower_bound\u0027  # purge starts from here."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Bak8%3D","line":31,"updated":"2013-11-26 11:32:14.000000000","message":"This introduces a de-facto schema for keeping data in memcached. It really needs to be specified. \n\nAlso - see some further comments below - I think we are mixing several levels of abstraction in a single class.\n\n* Reading stuff from the memcached and doing it more efficiently with batch reads\n* An API for a StateVault to consume\n* Some way of detecting a gap in updates\n\nThis is why the code is really unreadable, and will likely be difficult to maintain/change","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class MC_Synchronizer(state_vault.StorageBackend):"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    _update_count \u003d \u0027update_count\u0027"},{"line_number":34,"context_line":"    _update_lower_bound \u003d \u0027update_lower_bound\u0027  # purge starts from here."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZjA%3D","line":31,"in_reply_to":"AAAATn%2F%2Bak8%3D","updated":"2013-11-26 14:43:48.000000000","message":"Docstrings and expanded comments are coming soon.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            self.mc_client.add(self._namespace_count, 0)"},{"line_number":55,"context_line":"        except mc_module.Error as e:"},{"line_number":56,"context_line":"            self.__init__(self._namespace, self._addressses)"},{"line_number":57,"context_line":"            return"},{"line_number":58,"context_line":"        namespace_count \u003d self.mc_client.get(self._namespace_count)"},{"line_number":59,"context_line":"        ids \u003d map(str, xrange(1, namespace_count + 1))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BatE%3D","line":56,"updated":"2013-11-26 10:55:11.000000000","message":"You should move code needed for reinitialization to separate method and call it here and from __init__. Calling __init__ more than one time is error-prone.\n\nBTW. you can fall into infinite recursion here.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            self.mc_client.add(self._namespace_count, 0)"},{"line_number":55,"context_line":"        except mc_module.Error as e:"},{"line_number":56,"context_line":"            self.__init__(self._namespace, self._addressses)"},{"line_number":57,"context_line":"            return"},{"line_number":58,"context_line":"        namespace_count \u003d self.mc_client.get(self._namespace_count)"},{"line_number":59,"context_line":"        ids \u003d map(str, xrange(1, namespace_count + 1))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Baqw%3D","line":56,"updated":"2013-11-26 11:32:14.000000000","message":"re-initializing everything is a bad pattern. See how a similar thing is done in the libvirt driver for inspiration.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            self.mc_client.add(self._namespace_count, 0)"},{"line_number":55,"context_line":"        except mc_module.Error as e:"},{"line_number":56,"context_line":"            self.__init__(self._namespace, self._addressses)"},{"line_number":57,"context_line":"            return"},{"line_number":58,"context_line":"        namespace_count \u003d self.mc_client.get(self._namespace_count)"},{"line_number":59,"context_line":"        ids \u003d map(str, xrange(1, namespace_count + 1))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ4g%3D","line":56,"in_reply_to":"AAAATn%2F%2Baqw%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            self.mc_client.add(self._namespace_count, 0)"},{"line_number":55,"context_line":"        except mc_module.Error as e:"},{"line_number":56,"context_line":"            self.__init__(self._namespace, self._addressses)"},{"line_number":57,"context_line":"            return"},{"line_number":58,"context_line":"        namespace_count \u003d self.mc_client.get(self._namespace_count)"},{"line_number":59,"context_line":"        ids \u003d map(str, xrange(1, namespace_count + 1))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ4k%3D","line":56,"in_reply_to":"AAAATn%2F%2BatE%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        namespace_count \u003d self.mc_client.incr(self._namespace_count)"},{"line_number":66,"context_line":"        self.mc_client.set(self._ns_prefix + str(namespace_count), namespace)"},{"line_number":67,"context_line":"        self._namespace_id \u003d namespace_count"},{"line_number":68,"context_line":"        self.mc_client.set(self._get_name(self._record_count), 0)"},{"line_number":69,"context_line":"        self.mc_client.set(self._get_name(self._update_count), 0)"},{"line_number":70,"context_line":"        self.mc_client.set(self._get_name(self._update_lower_bound), 0)"},{"line_number":71,"context_line":"        LOG.info(_(\"Namespace %s was created.\") % (namespace))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Barw%3D","line":68,"updated":"2013-11-26 10:55:11.000000000","message":"set_multi should be more appropriate here.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        namespace_count \u003d self.mc_client.incr(self._namespace_count)"},{"line_number":66,"context_line":"        self.mc_client.set(self._ns_prefix + str(namespace_count), namespace)"},{"line_number":67,"context_line":"        self._namespace_id \u003d namespace_count"},{"line_number":68,"context_line":"        self.mc_client.set(self._get_name(self._record_count), 0)"},{"line_number":69,"context_line":"        self.mc_client.set(self._get_name(self._update_count), 0)"},{"line_number":70,"context_line":"        self.mc_client.set(self._get_name(self._update_lower_bound), 0)"},{"line_number":71,"context_line":"        LOG.info(_(\"Namespace %s was created.\") % (namespace))"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ4Y%3D","line":68,"in_reply_to":"AAAATn%2F%2Barw%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.mc_client.set(self._get_name(self._update_lower_bound), 0)"},{"line_number":71,"context_line":"        LOG.info(_(\"Namespace %s was created.\") % (namespace))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _run_batch(self, iterable, handler):"},{"line_number":74,"context_line":"        \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":75,"context_line":"        applies it."},{"line_number":76,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BarE%3D","line":73,"updated":"2013-11-26 10:55:11.000000000","message":"These methods should be moved to module namespace.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.mc_client.set(self._get_name(self._update_lower_bound), 0)"},{"line_number":71,"context_line":"        LOG.info(_(\"Namespace %s was created.\") % (namespace))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _run_batch(self, iterable, handler):"},{"line_number":74,"context_line":"        \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":75,"context_line":"        applies it."},{"line_number":76,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Baig%3D","line":73,"updated":"2013-11-26 11:32:14.000000000","message":"This has nothing to do with the class really - should be a standalone utils function or something. The more I think about it - I think it\u0027s at the wrong level of abstraction - when doing high-level stuff like get_records_since (which is what this class is about) - we don\u0027t care about what\u0027s the read query chunk size. Seems to me like a nicer abstraction would be a batch_mc_client wrapper that this class would use transparently.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.mc_client.set(self._get_name(self._update_lower_bound), 0)"},{"line_number":71,"context_line":"        LOG.info(_(\"Namespace %s was created.\") % (namespace))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _run_batch(self, iterable, handler):"},{"line_number":74,"context_line":"        \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":75,"context_line":"        applies it."},{"line_number":76,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ4I%3D","line":73,"in_reply_to":"AAAATn%2F%2Baig%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        self.mc_client.set(self._get_name(self._update_lower_bound), 0)"},{"line_number":71,"context_line":"        LOG.info(_(\"Namespace %s was created.\") % (namespace))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _run_batch(self, iterable, handler):"},{"line_number":74,"context_line":"        \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":75,"context_line":"        applies it."},{"line_number":76,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ4M%3D","line":73,"in_reply_to":"AAAATn%2F%2BarE%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":75,"context_line":"        applies it."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        def _break_into_chunks(iterable, chunk_size):"},{"line_number":78,"context_line":"            sentinel \u003d object()"},{"line_number":79,"context_line":"            i \u003d iter(iterable)"},{"line_number":80,"context_line":"            for chunk in itertools.izip_longest(*[i] * chunk_size,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Baq8%3D","line":77,"updated":"2013-11-26 10:55:11.000000000","message":"And this one can be separated from the outer one.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":75,"context_line":"        applies it."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        def _break_into_chunks(iterable, chunk_size):"},{"line_number":78,"context_line":"            sentinel \u003d object()"},{"line_number":79,"context_line":"            i \u003d iter(iterable)"},{"line_number":80,"context_line":"            for chunk in itertools.izip_longest(*[i] * chunk_size,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ4A%3D","line":77,"in_reply_to":"AAAATn%2F%2Baq8%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                                fillvalue\u003dsentinel):"},{"line_number":82,"context_line":"                yield [a for a in chunk if a is not sentinel]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        for i in _break_into_chunks(iterable, self._run_batch_chunk_size):"},{"line_number":85,"context_line":"            for j in handler(i):"},{"line_number":86,"context_line":"                yield j"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Bahw%3D","line":84,"updated":"2013-11-26 11:32:14.000000000","message":"i and j are horrible names - we have semantics here i\u003dchunks, j\u003dhandled_chunks (or something)","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                                fillvalue\u003dsentinel):"},{"line_number":82,"context_line":"                yield [a for a in chunk if a is not sentinel]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        for i in _break_into_chunks(iterable, self._run_batch_chunk_size):"},{"line_number":85,"context_line":"            for j in handler(i):"},{"line_number":86,"context_line":"                yield j"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ3o%3D","line":84,"in_reply_to":"AAAATn%2F%2Bahw%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            for j in handler(i):"},{"line_number":86,"context_line":"                yield j"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_name(self, _id\u003d\u0027\u0027):"},{"line_number":89,"context_line":"        return self._ns_prefix + str(self._namespace_id) + str(_id)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _fix_update_holes(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BaqQ%3D","line":88,"updated":"2013-11-26 10:55:11.000000000","message":"The default value is not used anywhere and should be removed.\n\nThe name for the argument should be \u0027id_\u0027.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            for j in handler(i):"},{"line_number":86,"context_line":"                yield j"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _get_name(self, _id\u003d\u0027\u0027):"},{"line_number":89,"context_line":"        return self._ns_prefix + str(self._namespace_id) + str(_id)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _fix_update_holes(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ3k%3D","line":88,"in_reply_to":"AAAATn%2F%2BaqQ%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"3e7f8e76747409c47d9cd48d56baf24933715bad","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def _get_name(self, _id\u003d\u0027\u0027):"},{"line_number":89,"context_line":"        return self._ns_prefix + str(self._namespace_id) + str(_id)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _fix_update_holes(self):"},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        for update_id, value in self._run_batch("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BaeY%3D","line":91,"updated":"2013-11-26 11:32:14.000000000","message":"This is a bad name too - it will not fix anything - it will just signal a reinitialization.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def _get_name(self, _id\u003d\u0027\u0027):"},{"line_number":89,"context_line":"        return self._ns_prefix + str(self._namespace_id) + str(_id)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _fix_update_holes(self):"},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        \"\"\""},{"line_number":94,"context_line":"        for update_id, value in self._run_batch("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZkI%3D","line":91,"in_reply_to":"AAAATn%2F%2BaeY%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        \"\"\""},{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        if token is None or not self._fix_update_holes():"},{"line_number":112,"context_line":"            self.__init__(self._namespace, self._addressses)"},{"line_number":113,"context_line":"            record_count \u003d self.mc_client.get("},{"line_number":114,"context_line":"                self._get_name(self._record_count))"},{"line_number":115,"context_line":"            updated_records \u003d xrange(1, record_count + 1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Bap4%3D","line":112,"updated":"2013-11-26 10:55:11.000000000","message":"Don\u0027t call self.__init__. See above.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        \"\"\""},{"line_number":110,"context_line":"        \"\"\""},{"line_number":111,"context_line":"        if token is None or not self._fix_update_holes():"},{"line_number":112,"context_line":"            self.__init__(self._namespace, self._addressses)"},{"line_number":113,"context_line":"            record_count \u003d self.mc_client.get("},{"line_number":114,"context_line":"                self._get_name(self._record_count))"},{"line_number":115,"context_line":"            updated_records \u003d xrange(1, record_count + 1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZr8%3D","line":112,"in_reply_to":"AAAATn%2F%2Bap4%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        records \u003d self._run_batch(updated_records, self._get_records)"},{"line_number":132,"context_line":"        for value in records:"},{"line_number":133,"context_line":"            yield value"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def get_records_since(self, token):"},{"line_number":136,"context_line":"        \"\"\"This function returns all records starting with the one having"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Bapg%3D","line":133,"updated":"2013-11-26 10:55:11.000000000","message":"You should just return records instead to avoid extra generator layer.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        records \u003d self._run_batch(updated_records, self._get_records)"},{"line_number":132,"context_line":"        for value in records:"},{"line_number":133,"context_line":"            yield value"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def get_records_since(self, token):"},{"line_number":136,"context_line":"        \"\"\"This function returns all records starting with the one having"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ3c%3D","line":133,"in_reply_to":"AAAATn%2F%2Bapg%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def _get_records(self, ids):"},{"line_number":157,"context_line":"        for i in self._get_entity(ids, self._rec_prefix):"},{"line_number":158,"context_line":"            yield i"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _get_updates(self, ids):"},{"line_number":161,"context_line":"        for i in self._get_entity(ids, self._upd_prefix):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Baog%3D","line":158,"updated":"2013-11-26 10:55:11.000000000","message":"Convert all\n\n    for i in some_method():\n        yield i\n\nto just\n\n    return some_method()\n\nTo avoid unnecessary levels of generators and make the code cleaner.","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def _get_records(self, ids):"},{"line_number":157,"context_line":"        for i in self._get_entity(ids, self._rec_prefix):"},{"line_number":158,"context_line":"            yield i"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _get_updates(self, ids):"},{"line_number":161,"context_line":"        for i in self._get_entity(ids, self._upd_prefix):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ3Y%3D","line":158,"in_reply_to":"AAAATn%2F%2Baog%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9c0e510a9547f8d6df96efef5d7dfb816babb397","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _get_updates(self, ids):"},{"line_number":161,"context_line":"        for i in self._get_entity(ids, self._upd_prefix):"},{"line_number":162,"context_line":"            yield i"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _get_entity(self, ids, prefix):"},{"line_number":165,"context_line":"        key_prefix \u003d self._ns_prefix + str(self._namespace_id) + prefix"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2Baoc%3D","line":162,"updated":"2013-11-26 10:55:11.000000000","message":"ditto","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac8fa0fad09b2fbd5e86773c3437799e8732f6dd","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def _get_updates(self, ids):"},{"line_number":161,"context_line":"        for i in self._get_entity(ids, self._upd_prefix):"},{"line_number":162,"context_line":"            yield i"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def _get_entity(self, ids, prefix):"},{"line_number":165,"context_line":"        key_prefix \u003d self._ns_prefix + str(self._namespace_id) + prefix"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAATn%2F%2BZ3U%3D","line":162,"in_reply_to":"AAAATn%2F%2Baoc%3D","updated":"2013-11-26 14:43:48.000000000","message":"Done","commit_id":"c1c28a15d3875321ad4a40f178ffac2ccf565521"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":33,"context_line":"def _run_batch(iterable, handler):"},{"line_number":34,"context_line":"    \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":35,"context_line":"    applies it."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    chunk_size \u003d CONF.run_batch_chunk_size"},{"line_number":38,"context_line":"    sentinel \u003d object()"},{"line_number":39,"context_line":"    i \u003d iter(iterable)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSKA%3D","line":36,"updated":"2013-11-27 21:33:41.000000000","message":"\"\"\"Apply handler to iterable in small chunks.\n\nThe size of each chunk is determined by CONF.run_batch_chunk_size.\n\"\"\"","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":33,"context_line":"def _run_batch(iterable, handler):"},{"line_number":34,"context_line":"    \"\"\"This method gets a list of entries to apply handler to and"},{"line_number":35,"context_line":"    applies it."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    chunk_size \u003d CONF.run_batch_chunk_size"},{"line_number":38,"context_line":"    sentinel \u003d object()"},{"line_number":39,"context_line":"    i \u003d iter(iterable)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMbI%3D","line":36,"in_reply_to":"AAAATn%2F%2BSKA%3D","updated":"2013-11-29 11:28:59.000000000","message":"Thank you.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        yield handler(chunk)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class MCClientWrapper(object):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, mc_client, prefix):"},{"line_number":48,"context_line":"        self.mc_client \u003d mc_client"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSJ4%3D","line":45,"updated":"2013-11-27 21:33:41.000000000","message":"This could use a comment, or a docstring, explaining why we have the wrapper.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        yield handler(chunk)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class MCClientWrapper(object):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def __init__(self, mc_client, prefix):"},{"line_number":48,"context_line":"        self.mc_client \u003d mc_client"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMck%3D","line":45,"in_reply_to":"AAAATn%2F%2BSJ4%3D","updated":"2013-11-29 11:28:59.000000000","message":"Sure, I\u0027ll add a proper description when approach to solution of this problem is setlled. Actually this is more a memcached-specific issue and I\u0027ll probably separate memcached backend to another patch set.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def _fix_update_holes(self):"},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        updated_records \u003d set()"},{"line_number":140,"context_line":"        for update_id, value in self._get_updates(self._update_holes.keys()):"},{"line_number":141,"context_line":"            self._update_holes.pop(update_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSJw%3D","line":138,"updated":"2013-11-27 21:33:41.000000000","message":"???","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def _fix_update_holes(self):"},{"line_number":137,"context_line":"        \"\"\""},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        updated_records \u003d set()"},{"line_number":140,"context_line":"        for update_id, value in self._get_updates(self._update_holes.keys()):"},{"line_number":141,"context_line":"            self._update_holes.pop(update_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMdk%3D","line":138,"in_reply_to":"AAAATn%2F%2BSJw%3D","updated":"2013-11-29 11:28:59.000000000","message":"Looks like a placeholder has crept in.","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"eea6e4d459da99ff3087767abd93dc736ab0b470","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _get_updated_records(self, token, update_count):"},{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":"        if token is not None:"},{"line_number":158,"context_line":"            updated_records \u003d self._fix_update_holes()"},{"line_number":159,"context_line":"            if updated_records is not None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BSJg%3D","line":156,"updated":"2013-11-27 21:33:41.000000000","message":"???","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"cc7e3f29e3d32730e0dc71bd4cf20d4f93a886e2","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def _get_updated_records(self, token, update_count):"},{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":"        if token is not None:"},{"line_number":158,"context_line":"            updated_records \u003d self._fix_update_holes()"},{"line_number":159,"context_line":"            if updated_records is not None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2BMdg%3D","line":156,"in_reply_to":"AAAATn%2F%2BSJg%3D","updated":"2013-11-29 11:28:59.000000000","message":"ditto","commit_id":"e7c011ff5b821509b14a5655aa0069109da2f595"}],"nova/scheduler/vault_backends/mysql.py":[{"author":{"_account_id":7624,"name":"Herman Narkaytis","email":"hnarkaytis@mirantis.com","username":"hnarkaytis"},"change_message_id":"7a9cacc1c9a3dd497a37e63ce6e07c159cc22b3f","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, namespace):"},{"line_number":22,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":23,"context_line":"        self._create_namespace(namespace)"},{"line_number":24,"context_line":"        super(MySQL_Synchronizer, self).__init__()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def _deserialize(self, json):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BbJ8%3D","line":23,"updated":"2013-11-26 09:11:40.000000000","message":"this line is not necessary. _create_namespace is called from parent class __init__","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8d0a0e024926604562f69c3dbf86df089e55ad53","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, namespace):"},{"line_number":22,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":23,"context_line":"        self._create_namespace(namespace)"},{"line_number":24,"context_line":"        super(MySQL_Synchronizer, self).__init__()"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def _deserialize(self, json):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Ba9o%3D","line":23,"in_reply_to":"AAAATn%2F%2BbJ8%3D","updated":"2013-11-26 10:14:53.000000000","message":"Done","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":7624,"name":"Herman Narkaytis","email":"hnarkaytis@mirantis.com","username":"hnarkaytis"},"change_message_id":"7a9cacc1c9a3dd497a37e63ce6e07c159cc22b3f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        else:"},{"line_number":45,"context_line":"            records \u003d db.synchronizer_get_records_since(self.context, token,"},{"line_number":46,"context_line":"                                                        self._namespace_id)"},{"line_number":47,"context_line":"        new_token \u003d db.synchronizer_get_token(self.context)[0]"},{"line_number":48,"context_line":"        records_gen \u003d (state_vault.record_tuple(record.id,"},{"line_number":49,"context_line":"                                    self._deserialize(record.value))"},{"line_number":50,"context_line":"                       for record in records)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BbM4%3D","line":47,"updated":"2013-11-26 09:11:40.000000000","message":"This line should be moved upwards. Otherwise it breaks transactional semantics.\nHere should be a check that result is not None. If DB is empty query will return None","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8d0a0e024926604562f69c3dbf86df089e55ad53","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        else:"},{"line_number":45,"context_line":"            records \u003d db.synchronizer_get_records_since(self.context, token,"},{"line_number":46,"context_line":"                                                        self._namespace_id)"},{"line_number":47,"context_line":"        new_token \u003d db.synchronizer_get_token(self.context)[0]"},{"line_number":48,"context_line":"        records_gen \u003d (state_vault.record_tuple(record.id,"},{"line_number":49,"context_line":"                                    self._deserialize(record.value))"},{"line_number":50,"context_line":"                       for record in records)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Ba9g%3D","line":47,"in_reply_to":"AAAATn%2F%2BbM4%3D","updated":"2013-11-26 10:14:53.000000000","message":"Good point, thank you.","commit_id":"fb1db8cf56288c6fa010bd098044df3210f08413"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"MySQL backend for nova.scheduler.state_vault.Synchronizer.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from nova.openstack.common import log as logging"},{"line_number":18,"context_line":"import simplejson"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova import context"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91ts%3D","line":17,"updated":"2013-12-05 11:33:35.000000000","message":"this is not a third party import","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"MySQL backend for nova.scheduler.state_vault.Synchronizer.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from nova.openstack.common import log as logging"},{"line_number":18,"context_line":"import simplejson"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from nova import context"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91Yw%3D","line":17,"in_reply_to":"AAAATn%2F91ts%3D","updated":"2013-12-05 13:24:23.000000000","message":"Done","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"09fa568ec78e80c48f181d94c2b7380705d5ce66","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova import db"},{"line_number":22,"context_line":"from nova.db import base"},{"line_number":23,"context_line":"import nova.scheduler.state_vault as state_vault"},{"line_number":24,"context_line":"from oslo.config import cfg"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91tc%3D","line":24,"updated":"2013-12-05 11:33:35.000000000","message":"this is","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"db4ec976c07b5bb4d10ceba9c53ce0b5af93c396","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova import db"},{"line_number":22,"context_line":"from nova.db import base"},{"line_number":23,"context_line":"import nova.scheduler.state_vault as state_vault"},{"line_number":24,"context_line":"from oslo.config import cfg"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F91YU%3D","line":24,"in_reply_to":"AAAATn%2F91tc%3D","updated":"2013-12-05 13:24:23.000000000","message":"Done","commit_id":"609fed9e6d2de0dc1de362d65a63b0ba792f9b11"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"bc46d8f16f7b28c51101c88776c7d8a7bed9d456","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova import db"},{"line_number":22,"context_line":"from nova.db import base"},{"line_number":23,"context_line":"from nova.openstack.common import log as logging"},{"line_number":24,"context_line":"import nova.scheduler.state_vault as state_vault"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAT3%2F%2F1pI%3D","line":24,"updated":"2013-12-30 12:32:36.000000000","message":"can you please clarify why you use this here and not the from ...","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova import db"},{"line_number":22,"context_line":"from nova.db import base"},{"line_number":23,"context_line":"from nova.openstack.common import log as logging"},{"line_number":24,"context_line":"import nova.scheduler.state_vault as state_vault"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtOQ%3D","line":24,"in_reply_to":"AAAAT3%2F%2F1pI%3D","updated":"2014-01-09 12:06:18.000000000","message":"There are some auxiliary functions defined in state_vault which I use here. On one hand I don\u0027t want to pollute the namespace, on the other I would prefer to have a short alias, so this the reason I use import here.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class MySQL_Synchronizer(state_vault.StorageBackend, base.Base):"},{"line_number":33,"context_line":"    \"\"\"This class provides interface for actual bacend and several high-level"},{"line_number":34,"context_line":"    functions to support it."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2Fxwk%3D","line":33,"updated":"2014-01-08 15:49:08.000000000","message":"nit: backend","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class MySQL_Synchronizer(state_vault.StorageBackend, base.Base):"},{"line_number":33,"context_line":"    \"\"\"This class provides interface for actual bacend and several high-level"},{"line_number":34,"context_line":"    functions to support it."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtOM%3D","line":33,"in_reply_to":"AAAAUH%2F%2Fxwk%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"bc46d8f16f7b28c51101c88776c7d8a7bed9d456","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(MySQL_Synchronizer, self).__init__(namespace)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _deserialize(self, json):"},{"line_number":42,"context_line":"        return anyjson.loads(json)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _serialize(self, dct):"},{"line_number":45,"context_line":"        return anyjson.dumps(dct)"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAT3%2F%2F1pE%3D","line":42,"updated":"2013-12-30 12:32:36.000000000","message":"why not the common json module - https://github.com/openstack/nova/blob/master/nova/openstack/common/jsonutils.py","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(MySQL_Synchronizer, self).__init__(namespace)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _deserialize(self, json):"},{"line_number":42,"context_line":"        return anyjson.loads(json)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _serialize(self, dct):"},{"line_number":45,"context_line":"        return anyjson.dumps(dct)"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtN8%3D","line":42,"in_reply_to":"AAAAT3%2F%2F1pE%3D","updated":"2014-01-09 12:06:18.000000000","message":"anyjson is good at serializing dictionaries.","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"71243e69e57a4285ed2cf9963010d02183ebf0ff","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        return namespace"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_records_since(self, token):"},{"line_number":54,"context_line":"        \"\"\"Returns all records wich have ids greater then specified token.\"\"\""},{"line_number":55,"context_line":"        new_token, records \u003d db.synchronizer_get_records_since(self.context,"},{"line_number":56,"context_line":"                                 token, self._namespace_id)"},{"line_number":57,"context_line":"        records_gen \u003d [state_vault.record_tuple(record.id,"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FxwM%3D","line":54,"updated":"2014-01-08 15:49:08.000000000","message":"nit: which","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"a7f5417ec9aa6d5888dd5f6290fdfe5908880275","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        return namespace"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def get_records_since(self, token):"},{"line_number":54,"context_line":"        \"\"\"Returns all records wich have ids greater then specified token.\"\"\""},{"line_number":55,"context_line":"        new_token, records \u003d db.synchronizer_get_records_since(self.context,"},{"line_number":56,"context_line":"                                 token, self._namespace_id)"},{"line_number":57,"context_line":"        records_gen \u003d [state_vault.record_tuple(record.id,"}],"source_content_type":"text/x-python","patch_set":38,"id":"AAAAUH%2F%2FtN4%3D","line":54,"in_reply_to":"AAAAUH%2F%2FxwM%3D","updated":"2014-01-09 12:06:18.000000000","message":"Done","commit_id":"af78fd278f852d2105d3ad34bd0c4f5ee729ca31"}],"nova/tests/compute/test_resource_tracker.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a1e51680d18006ff92e82682c38724dca8831de6","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self._instances \u003d {}"},{"line_number":111,"context_line":"        self._instance_types \u003d {}"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"# As we plan to store thinggs in scheduler\u0027s memory now we need a scheduler."},{"line_number":114,"context_line":"        self.scheduler \u003d self.start_service(\u0027scheduler\u0027)"},{"line_number":115,"context_line":"        self.stubs.Set(self.conductor.db,"},{"line_number":116,"context_line":"                       \u0027instance_get_all_by_host_and_node\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS1c%3D","line":113,"updated":"2013-11-11 14:35:47.000000000","message":"indentation","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b49976acd6bf15f278962de9dae386f65f01d9c","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self._instances \u003d {}"},{"line_number":111,"context_line":"        self._instance_types \u003d {}"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"# As we plan to store thinggs in scheduler\u0027s memory now we need a scheduler."},{"line_number":114,"context_line":"        self.scheduler \u003d self.start_service(\u0027scheduler\u0027)"},{"line_number":115,"context_line":"        self.stubs.Set(self.conductor.db,"},{"line_number":116,"context_line":"                       \u0027instance_get_all_by_host_and_node\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FS0o%3D","line":113,"in_reply_to":"AAAATn%2F%2FS1c%3D","updated":"2013-11-11 14:42:57.000000000","message":"Done","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.json.tpl":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a1e51680d18006ff92e82682c38724dca8831de6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"        \"running_vms\": 0,"},{"line_number":17,"context_line":"        \"service\": {"},{"line_number":18,"context_line":"            \"host\": \"%(host_name)s\","},{"line_number":19,"context_line":"            \"id\": 3"},{"line_number":20,"context_line":"        },"},{"line_number":21,"context_line":"        \"vcpus\": 1,"},{"line_number":22,"context_line":"        \"vcpus_used\": 0"}],"source_content_type":"text/x-smarty","patch_set":7,"id":"AAAATn%2F%2FS1Y%3D","line":19,"updated":"2013-11-11 14:35:47.000000000","message":"why this chnage","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b49976acd6bf15f278962de9dae386f65f01d9c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"        \"running_vms\": 0,"},{"line_number":17,"context_line":"        \"service\": {"},{"line_number":18,"context_line":"            \"host\": \"%(host_name)s\","},{"line_number":19,"context_line":"            \"id\": 3"},{"line_number":20,"context_line":"        },"},{"line_number":21,"context_line":"        \"vcpus\": 1,"},{"line_number":22,"context_line":"        \"vcpus_used\": 0"}],"source_content_type":"text/x-smarty","patch_set":7,"id":"AAAATn%2F%2FS0E%3D","line":19,"in_reply_to":"AAAATn%2F%2FS1Y%3D","updated":"2013-11-11 14:42:57.000000000","message":"To bring it in accord with change done to doc/api_samples/os-hypervisors/hypervisors-show-resp.json","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"nova/tests/integrated/api_samples/os-hypervisors/hypervisors-show-resp.xml.tpl":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a1e51680d18006ff92e82682c38724dca8831de6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e"},{"line_number":2,"context_line":"\u003chypervisor vcpus_used\u003d\"0\" hypervisor_type\u003d\"fake\" local_gb_used\u003d\"0\" hypervisor_hostname\u003d\"fake-mini\" memory_mb_used\u003d\"512\" memory_mb\u003d\"8192\" current_workload\u003d\"0\" vcpus\u003d\"1\" cpu_info\u003d\"?\" running_vms\u003d\"0\" free_disk_gb\u003d\"1028\" hypervisor_version\u003d\"1\" disk_available_least\u003d\"0\" local_gb\u003d\"1028\" free_ram_mb\u003d\"7680\" id\u003d\"%(hypervisor_id)s\"\u003e"},{"line_number":3,"context_line":"  \u003cservice host\u003d\"%(host_name)s\" id\u003d\"3\"/\u003e"},{"line_number":4,"context_line":"\u003c/hypervisor\u003e"}],"source_content_type":"text/x-smarty","patch_set":7,"id":"AAAATn%2F%2FS1Q%3D","line":3,"updated":"2013-11-11 14:35:47.000000000","message":"ditto","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"8b49976acd6bf15f278962de9dae386f65f01d9c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e"},{"line_number":2,"context_line":"\u003chypervisor vcpus_used\u003d\"0\" hypervisor_type\u003d\"fake\" local_gb_used\u003d\"0\" hypervisor_hostname\u003d\"fake-mini\" memory_mb_used\u003d\"512\" memory_mb\u003d\"8192\" current_workload\u003d\"0\" vcpus\u003d\"1\" cpu_info\u003d\"?\" running_vms\u003d\"0\" free_disk_gb\u003d\"1028\" hypervisor_version\u003d\"1\" disk_available_least\u003d\"0\" local_gb\u003d\"1028\" free_ram_mb\u003d\"7680\" id\u003d\"%(hypervisor_id)s\"\u003e"},{"line_number":3,"context_line":"  \u003cservice host\u003d\"%(host_name)s\" id\u003d\"3\"/\u003e"},{"line_number":4,"context_line":"\u003c/hypervisor\u003e"}],"source_content_type":"text/x-smarty","patch_set":7,"id":"AAAATn%2F%2FSzk%3D","line":3,"in_reply_to":"AAAATn%2F%2FS1Q%3D","updated":"2013-11-11 14:42:57.000000000","message":"the same reason as before.","commit_id":"0fa86d90b82104ef6c10d1b6773cc328fff68791"}],"nova/tests/scheduler/test_host_manager.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        #self.mox.StubOutWithMock(db, \u0027compute_node_get_all\u0027)"},{"line_number":380,"context_line":"        #db.compute_node_get_all(context).AndReturn(fakes.COMPUTE_NODES)"},{"line_number":381,"context_line":"        self.mox.ReplayAll()"},{"line_number":382,"context_line":"        self.host_manager.mc_synchronizer.get_all \u003d lambda: fakes.COMPUTE_NODES"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        self.host_manager.get_all_host_states(context)"},{"line_number":385,"context_line":"        host_states_map \u003d self.host_manager.host_state_map"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FMuw%3D","line":382,"updated":"2013-10-02 14:19:36.000000000","message":"You should use mox here.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        #self.mox.StubOutWithMock(db, \u0027compute_node_get_all\u0027)"},{"line_number":380,"context_line":"        #db.compute_node_get_all(context).AndReturn(fakes.COMPUTE_NODES)"},{"line_number":381,"context_line":"        self.mox.ReplayAll()"},{"line_number":382,"context_line":"        self.host_manager.mc_synchronizer.get_all \u003d lambda: fakes.COMPUTE_NODES"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        self.host_manager.get_all_host_states(context)"},{"line_number":385,"context_line":"        host_states_map \u003d self.host_manager.host_state_map"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwNs%3D","line":382,"in_reply_to":"AAAAS3%2F%2FMuw%3D","updated":"2013-10-10 11:29:21.000000000","message":"Done","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"}],"nova/tests/scheduler/test_state_vault.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"7e847a3351d0fe4fc511457e87387cb751d089d4","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        self.flags(storage_backend\u003d"},{"line_number":92,"context_line":"            \u0027nova.tests.scheduler.test_state_vault.FakeStorageBackend\u0027,"},{"line_number":93,"context_line":"            group\u003d\u0027state_synchronizer\u0027)"},{"line_number":94,"context_line":"        self.flags(entry_expiration_time\u003d1, group\u003d\u0027state_synchronizer\u0027)"},{"line_number":95,"context_line":"        CONF.entry_expiration_time \u003d 1"},{"line_number":96,"context_line":"        self.Synchronizer \u003d state_vault.Synchronizer()"},{"line_number":97,"context_line":"        self.Synchronizer2 \u003d state_vault.Synchronizer()"}],"source_content_type":"text/x-python","patch_set":46,"id":"AAAAUH%2F%2BS%2Bw%3D","line":94,"updated":"2014-01-28 09:34:17.000000000","message":"nit: this would look neater (to me, at least) as:\n\n self.flags(group\u003d\u0027state_synchronizer\u0027,\n     entry_expiration_time\u003d1,\n     storage_backend\u003d\n         \u0027nova.tests.scheduler.test_state_vault.FakeStorageBackend\u0027)","commit_id":"b291cf178042cd4102b3553afdec43afc685d999"}],"requirements.txt":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"pbr\u003e\u003d0.5.21,\u003c1.0"},{"line_number":2,"context_line":"SQLAlchemy\u003e\u003d0.7.8,\u003c0.8"},{"line_number":3,"context_line":"amqplib\u003e\u003d0.6.1"},{"line_number":4,"context_line":"anyjson\u003e\u003d0.3.3"},{"line_number":5,"context_line":"argparse"}],"source_content_type":"text/plain","patch_set":6,"id":"AAAAS3%2F%2FMuY%3D","line":2,"updated":"2013-10-02 14:19:36.000000000","message":"I guess, you don\u0027t need to change it here.","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":1,"context_line":"pbr\u003e\u003d0.5.21,\u003c1.0"},{"line_number":2,"context_line":"SQLAlchemy\u003e\u003d0.7.8,\u003c0.8"},{"line_number":3,"context_line":"amqplib\u003e\u003d0.6.1"},{"line_number":4,"context_line":"anyjson\u003e\u003d0.3.3"},{"line_number":5,"context_line":"argparse"}],"source_content_type":"text/plain","patch_set":6,"id":"AAAATH%2F%2FwP4%3D","line":2,"in_reply_to":"AAAAS3%2F%2FMuY%3D","updated":"2013-10-10 11:29:21.000000000","message":"fixed this","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"}],"setup.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"098d18a99836edc32fe4a79ef6339dfae689992f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import setuptools"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"setuptools.setup("},{"line_number":21,"context_line":"    setup_requires\u003d[\u0027pbr\u003e\u003d0.5.21,\u003c1.0\u0027],"},{"line_number":22,"context_line":"    pbr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FMuQ%3D","line":21,"updated":"2013-10-02 14:19:36.000000000","message":"ditto","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"},{"author":{"_account_id":6938,"name":"Alexey Ovchinnikov","email":"aovchinnikov@mirantis.com","username":"aovchinnikov"},"change_message_id":"ac409f7e567546b712f9e7ee5403065a1e6d9646","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import setuptools"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"setuptools.setup("},{"line_number":21,"context_line":"    setup_requires\u003d[\u0027pbr\u003e\u003d0.5.21,\u003c1.0\u0027],"},{"line_number":22,"context_line":"    pbr\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FwP8%3D","line":21,"in_reply_to":"AAAAS3%2F%2FMuQ%3D","updated":"2013-10-10 11:29:21.000000000","message":"fixed","commit_id":"0a691c9b7b2b08f04df4e99bb5f0d487c74d5cdf"}]}
