)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e96e50750899a13b6a05151f1255c0fabcb852e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1abeadc6_4eb2db4c","updated":"2014-08-21 22:39:51.000000000","message":"Can you give a little more detail here?","commit_id":"4a3c6857738353484b3f33361c5472f174081c04"}],"ironic/common/sync_factory.py":[{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"bf77da266a9c679ab296c402776d5f15956bf6a8","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    and proxies calls to its attributes to the underlying backend object."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    \"\"\""},{"line_number":51,"context_line":"    def __init__(self, backend_name, lazy\u003dFalse):"},{"line_number":52,"context_line":"        \"\"\"Create a new SyncManagerProxy."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        Loads a driver implementing :class:`BaseSyncManager`."}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_3e88c4e6","line":51,"updated":"2014-08-20 00:02:42.000000000","message":"Why would you want lazy loading?","commit_id":"398495ce06859b5671f0adec0b4c8f7c38d0d31d"},{"author":{"_account_id":11739,"name":"Alex Weeks","email":"alex.weeks@gmail.com","username":"aweeks"},"change_message_id":"7d1273bb44c93395ae3c05ba92870d31deb2e6be","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                invoke_on_load\u003dTrue)"},{"line_number":85,"context_line":"            self._backend \u003d driver_manager.driver"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def __getattr__(self, key):"},{"line_number":88,"context_line":"        \"\"\"Proxy calls to keys on this object to the underlying driver.\"\"\""},{"line_number":89,"context_line":"        if not self._backend:"},{"line_number":90,"context_line":"            self._load_backend()"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_c7ded36c","line":87,"updated":"2014-08-21 21:37:26.000000000","message":"This proxy class seems unnecessarily complicated.  You already have a global _sync_manager (see get_manager()), couldn\u0027t that simply contain an instance of a BaseSyncManager child class?  The locking would need to be handled in get_manager().","commit_id":"4a3c6857738353484b3f33361c5472f174081c04"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cde215d0700f89bba116f49b88808a5417905c6c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                  {\u0027manager_name\u0027: self._backend_name})"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        if not lazy:"},{"line_number":69,"context_line":"            self._load_backend()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _load_backend(self):"},{"line_number":72,"context_line":"        \"\"\"Attempts to initialize the backend driver.\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa98f980_ce070980","line":69,"updated":"2014-09-10 18:56:34.000000000","message":"I might be wrong, but won\u0027t this proxy to self._backend, due to __getattr__ being overridden? And the same thing would happen in __getattr__? And so on and so forth until the stack is blown?","commit_id":"87ffd3b881ab09a07a1f1635fbdf318545e71f89"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"ffa0400b61a380b16bcb267992ed082db13a3bb1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                  {\u0027manager_name\u0027: self._backend_name})"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        if not lazy:"},{"line_number":69,"context_line":"            self._load_backend()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _load_backend(self):"},{"line_number":72,"context_line":"        \"\"\"Attempts to initialize the backend driver.\"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa98f980_1e206048","line":69,"in_reply_to":"fa98f980_ce070980","updated":"2014-09-10 20:08:48.000000000","message":"https://docs.python.org/2/reference/datamodel.html#object.__getattr__\n\n\u003eNote that if the attribute is found through the normal mechanism, __getattr__() is not called.\n\nSince _load_backend is an attribute on this class, it won\u0027t trigger __getattr__.","commit_id":"87ffd3b881ab09a07a1f1635fbdf318545e71f89"}],"ironic/conductor/task_manager.py":[{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"bf77da266a9c679ab296c402776d5f15956bf6a8","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        def reserve_node():"},{"line_number":182,"context_line":"            LOG.debug(\"Attempting to reserve node %(node)s\","},{"line_number":183,"context_line":"                      {\u0027node\u0027: node_id})"},{"line_number":184,"context_line":"            self.node \u003d self.sync.reserve_node(node_id)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        try:"},{"line_number":187,"context_line":"            if not self.shared:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_2146e97c","line":184,"updated":"2014-08-20 00:02:42.000000000","message":"I still think it makes sense to pass shared into the driver, even if it isn\u0027t really used currently.","commit_id":"398495ce06859b5671f0adec0b4c8f7c38d0d31d"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"6587796245f2305db0f180c05f4723aafc2625de","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        def reserve_node():"},{"line_number":182,"context_line":"            LOG.debug(\"Attempting to reserve node %(node)s\","},{"line_number":183,"context_line":"                      {\u0027node\u0027: node_id})"},{"line_number":184,"context_line":"            self.node \u003d self.sync.reserve_node(node_id)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        try:"},{"line_number":187,"context_line":"            if not self.shared:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_db96b04b","line":184,"in_reply_to":"1abeadc6_2146e97c","updated":"2014-08-21 19:41:03.000000000","message":"Done","commit_id":"398495ce06859b5671f0adec0b4c8f7c38d0d31d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"bf77da266a9c679ab296c402776d5f15956bf6a8","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        if not self.shared:"},{"line_number":229,"context_line":"            try:"},{"line_number":230,"context_line":"                if self.node:"},{"line_number":231,"context_line":"                    self.sync.release_node(self.node.id)"},{"line_number":232,"context_line":"            except exception.NodeNotFound:"},{"line_number":233,"context_line":"                # squelch the exception if the node was deleted"},{"line_number":234,"context_line":"                # within the task\u0027s context."}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_41404556","line":231,"updated":"2014-08-20 00:02:42.000000000","message":"Here as well, you can pass shared into release, and still wrap it in a try/except to squash/retry. DBAPI would no-op, other systems may want to use it.","commit_id":"398495ce06859b5671f0adec0b4c8f7c38d0d31d"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"6587796245f2305db0f180c05f4723aafc2625de","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        if not self.shared:"},{"line_number":229,"context_line":"            try:"},{"line_number":230,"context_line":"                if self.node:"},{"line_number":231,"context_line":"                    self.sync.release_node(self.node.id)"},{"line_number":232,"context_line":"            except exception.NodeNotFound:"},{"line_number":233,"context_line":"                # squelch the exception if the node was deleted"},{"line_number":234,"context_line":"                # within the task\u0027s context."}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_1b9d8866","line":231,"in_reply_to":"1abeadc6_41404556","updated":"2014-08-21 19:41:03.000000000","message":"Done","commit_id":"398495ce06859b5671f0adec0b4c8f7c38d0d31d"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e96e50750899a13b6a05151f1255c0fabcb852e8","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        try:"},{"line_number":173,"context_line":"            LOG.debug(\"Attempting to reserve node %(node)s\","},{"line_number":174,"context_line":"                      {\u0027node\u0027: node_id})"},{"line_number":175,"context_line":"            if not self.shared:"},{"line_number":176,"context_line":"                self.node \u003d self.sync.reserve_node(node_id, self.context,"},{"line_number":177,"context_line":"                                                   shared\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_eea1e7f8","line":174,"updated":"2014-08-21 22:39:51.000000000","message":"Could you add shared or exclusive to this log message? Might be confusing (I realize you\u0027re just copying this from the old code)","commit_id":"4a3c6857738353484b3f33361c5472f174081c04"}],"ironic/sync/base.py":[{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"991750a20eb1b968e9bf3d930fd927123df7df49","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        pass"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @abc.abstractmethod"},{"line_number":33,"context_line":"    def reserve_node(self, node_id, context, shared\u003dFalse):"},{"line_number":34,"context_line":"        \"\"\"Lock a single node."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        If this operation raises an exception, it must release any nodes that"}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_bb473476","line":33,"updated":"2014-08-21 21:22:30.000000000","message":"Update docstring to include params","commit_id":"768a4d998d46d48b4ce28802a52b0bf9dfb6ce00"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"991750a20eb1b968e9bf3d930fd927123df7df49","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @abc.abstractmethod"},{"line_number":42,"context_line":"    def release_node(self, node_id, shared\u003dFalse):"},{"line_number":43,"context_line":"        \"\"\"Release a single node.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"1abeadc6_db5f903f","line":43,"updated":"2014-08-21 21:22:30.000000000","message":"Update docstring to include params","commit_id":"768a4d998d46d48b4ce28802a52b0bf9dfb6ce00"},{"author":{"_account_id":11739,"name":"Alex Weeks","email":"alex.weeks@gmail.com","username":"aweeks"},"change_message_id":"7d1273bb44c93395ae3c05ba92870d31deb2e6be","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @abc.abstractmethod"},{"line_number":33,"context_line":"    def reserve_node(self, node_id, context, shared\u003dFalse):"},{"line_number":34,"context_line":"        \"\"\"Lock a single node."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        If this operation raises an exception, it must release any nodes that"},{"line_number":37,"context_line":"        were locked during the course of the operation."}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_e7702f74","line":34,"updated":"2014-08-21 21:37:26.000000000","message":"Should document return value (if any).","commit_id":"4a3c6857738353484b3f33361c5472f174081c04"},{"author":{"_account_id":11739,"name":"Alex Weeks","email":"alex.weeks@gmail.com","username":"aweeks"},"change_message_id":"7d1273bb44c93395ae3c05ba92870d31deb2e6be","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @abc.abstractmethod"},{"line_number":42,"context_line":"    def release_node(self, node_id, shared\u003dFalse):"},{"line_number":43,"context_line":"        \"\"\"Release a single node.\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_275067d3","line":43,"updated":"2014-08-21 21:37:26.000000000","message":"Should document return value (if any).","commit_id":"4a3c6857738353484b3f33361c5472f174081c04"}],"ironic/sync/dbapi.py":[{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e96e50750899a13b6a05151f1255c0fabcb852e8","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    # module expects a wait_fixed value in milliseconds."},{"line_number":42,"context_line":"    @retrying.retry("},{"line_number":43,"context_line":"        retry_on_exception\u003dlambda e: isinstance(e, exception.NodeLocked),"},{"line_number":44,"context_line":"        stop_max_attempt_number\u003dCONF.conductor.node_locked_retry_attempts,"},{"line_number":45,"context_line":"        wait_fixed\u003dCONF.conductor.node_locked_retry_interval * 1000)"},{"line_number":46,"context_line":"    def reserve_node(self, node_id, context, shared\u003dFalse):"},{"line_number":47,"context_line":"        if not shared:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_2b7031db","line":44,"updated":"2014-08-21 22:39:51.000000000","message":"This seems like it would become driver dependent and individual drivers would want different defaults. I\u0027d rather see these CONF options in this module (make sure to set deprecated_group\u003dconductor on the options if you move them)","commit_id":"4a3c6857738353484b3f33361c5472f174081c04"},{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"e96e50750899a13b6a05151f1255c0fabcb852e8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        retry_on_exception\u003dlambda e: isinstance(e, exception.NodeLocked),"},{"line_number":44,"context_line":"        stop_max_attempt_number\u003dCONF.conductor.node_locked_retry_attempts,"},{"line_number":45,"context_line":"        wait_fixed\u003dCONF.conductor.node_locked_retry_interval * 1000)"},{"line_number":46,"context_line":"    def reserve_node(self, node_id, context, shared\u003dFalse):"},{"line_number":47,"context_line":"        if not shared:"},{"line_number":48,"context_line":"            return self.dbapi.reserve_node(CONF.host, node_id)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1abeadc6_cb4dfd9b","line":46,"updated":"2014-08-21 22:39:51.000000000","message":"To echo Alex\u0027s comment, you should put doc strings on these functions.","commit_id":"4a3c6857738353484b3f33361c5472f174081c04"}],"ironic/tests/sync/__init__.py":[{"author":{"_account_id":10380,"name":"Josh Gachnang","email":"josh@pcsforeducation.com","username":"JoshNang"},"change_message_id":"bf77da266a9c679ab296c402776d5f15956bf6a8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_a17839f3","line":1,"updated":"2014-08-20 00:02:42.000000000","message":"Pretty sure this can be blank","commit_id":"398495ce06859b5671f0adec0b4c8f7c38d0d31d"},{"author":{"_account_id":9856,"name":"Kyle Stevenson","email":"kyle@kylestevenson.me","username":"kylestev"},"change_message_id":"6587796245f2305db0f180c05f4723aafc2625de","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":7,"id":"1abeadc6_9ba99892","line":1,"in_reply_to":"1abeadc6_a17839f3","updated":"2014-08-21 19:41:03.000000000","message":"Good catch!","commit_id":"398495ce06859b5671f0adec0b4c8f7c38d0d31d"}]}
