)]}'
{"cinder/volume/drivers/tintri.py":[{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"88447881a515e334d1c45d24be8f4c98a5a42034","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"\"\"Base class for Tintri driver.\"\"\""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    VENDOR \u003d \u0027Tintri\u0027"},{"line_number":73,"context_line":"    VERSION \u003d \u00272.1.0.1\u0027"},{"line_number":74,"context_line":"    REQUIRED_OPTIONS \u003d [\u0027tintri_server_hostname\u0027, \u0027tintri_server_username\u0027,"},{"line_number":75,"context_line":"                        \u0027tintri_server_password\u0027]"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_ad42c23c","line":73,"range":{"start_line":73,"start_character":15,"end_line":73,"end_character":22},"updated":"2016-01-19 18:52:17.000000000","message":"Should you change version number?","commit_id":"2dadc3f394e44d71fcd04ddac825ac702483638f"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"88447881a515e334d1c45d24be8f4c98a5a42034","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        if int(r.json()[\u0027filteredTotal\u0027]) \u003e 0:"},{"line_number":871,"context_line":"            return r.json()[\u0027items\u0027][0][\u0027uuid\u0027][\u0027uuid\u0027]"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"    def get_image_snapshots_to_date(self, date):"},{"line_number":874,"context_line":"        filter \u003d {\u0027sortedBy\u0027: \u0027createTime\u0027,"},{"line_number":875,"context_line":"                  \u0027target\u0027: \u0027SNAPSHOT\u0027,"},{"line_number":876,"context_line":"                  \u0027consistency\u0027: \u0027CRASH_CONSISTENT\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_2d5fb2e6","line":873,"range":{"start_line":873,"start_character":8,"end_line":873,"end_character":35},"updated":"2016-01-19 18:52:17.000000000","message":"If this is only used internally in this class, should start with _","commit_id":"2dadc3f394e44d71fcd04ddac825ac702483638f"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"d0466b3ceb9f515b0289b8aaead1f76b7ce6f1c0","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        if int(r.json()[\u0027filteredTotal\u0027]) \u003e 0:"},{"line_number":871,"context_line":"            return r.json()[\u0027items\u0027][0][\u0027uuid\u0027][\u0027uuid\u0027]"},{"line_number":872,"context_line":""},{"line_number":873,"context_line":"    def get_image_snapshots_to_date(self, date):"},{"line_number":874,"context_line":"        filter \u003d {\u0027sortedBy\u0027: \u0027createTime\u0027,"},{"line_number":875,"context_line":"                  \u0027target\u0027: \u0027SNAPSHOT\u0027,"},{"line_number":876,"context_line":"                  \u0027consistency\u0027: \u0027CRASH_CONSISTENT\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a68dd71_ac2f4ba0","line":873,"range":{"start_line":873,"start_character":8,"end_line":873,"end_character":35},"in_reply_to":"ba63e191_2d5fb2e6","updated":"2016-01-20 21:45:30.000000000","message":"This is exposed through TintriClient, hence not treating as internal.","commit_id":"2dadc3f394e44d71fcd04ddac825ac702483638f"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"a37b5d312beb0f42e02f99e34151df2bc3dab61f","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self._move_cloned_volume(clone_name, volume_id, share)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @utils.synchronized(\u0027cache_cleanup\u0027)"},{"line_number":228,"context_line":"    def _initiate_image_cache_cleanup(self):"},{"line_number":229,"context_line":"        if self.cache_cleanup:"},{"line_number":230,"context_line":"            LOG.debug(\u0027Image cache cleanup in progress.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_5d70b172","line":227,"updated":"2016-02-03 18:42:56.000000000","message":"Do you need to synchronize with where the cached snapshots are actually used to make sure you don\u0027t clean up one as it\u0027s being used?","commit_id":"b08bb6275fc1405ee1146fd5aa117c55602550de"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"027856e7c0a1dc51a35749075e2500c9cfa850b7","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self._move_cloned_volume(clone_name, volume_id, share)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @utils.synchronized(\u0027cache_cleanup\u0027)"},{"line_number":228,"context_line":"    def _initiate_image_cache_cleanup(self):"},{"line_number":229,"context_line":"        if self.cache_cleanup:"},{"line_number":230,"context_line":"            LOG.debug(\u0027Image cache cleanup in progress.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_ab4abb81","line":227,"in_reply_to":"5a5ae5dd_5d70b172","updated":"2016-02-03 19:51:57.000000000","message":"This deletion is a best effort operation. If the snapshot is being used, deletion will error out","commit_id":"b08bb6275fc1405ee1146fd5aa117c55602550de"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"4433ed05156344bcbb3974c8006d7fefab56a901","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        else:"},{"line_number":233,"context_line":"            self.cache_cleanup \u003d True"},{"line_number":234,"context_line":"            t \u003d threading.Timer(0, self._cleanup_cache)"},{"line_number":235,"context_line":"            t.start()"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _cleanup_cache(self):"},{"line_number":238,"context_line":"        LOG.debug(\u0027Cache cleanup: starting.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a57f1b5_c38eb0cf","line":235,"updated":"2016-02-11 18:01:19.000000000","message":"This seems rather dangerous to me because it\u0027s using native threads rather than eventlet threads, which is what we usually do.\n\nIMO this should be launched with oslo.service\u0027s FixedIntervalLoopingCall, and raise the LoopingCallDone() exception when completed.\n\nThis is based on greenthreads/eventlet which is likely much safer.  The fact that some other instances of this pattern exist in drivers is probably a bug...","commit_id":"b08bb6275fc1405ee1146fd5aa117c55602550de"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6d7c154541b97572662ca04f38152f90afd9c41a","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        else:"},{"line_number":233,"context_line":"            self.cache_cleanup \u003d True"},{"line_number":234,"context_line":"            t \u003d threading.Timer(0, self._cleanup_cache)"},{"line_number":235,"context_line":"            t.start()"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _cleanup_cache(self):"},{"line_number":238,"context_line":"        LOG.debug(\u0027Cache cleanup: starting.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a57f1b5_6af6a8fa","line":235,"in_reply_to":"3a57f1b5_b4fac541","updated":"2016-02-11 21:06:20.000000000","message":"Raise LoopingCallDone when the thread is done and it won\u0027t loop.","commit_id":"b08bb6275fc1405ee1146fd5aa117c55602550de"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"3e46e1b9655bf516fcafdbd626b333f5b9dff448","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        else:"},{"line_number":233,"context_line":"            self.cache_cleanup \u003d True"},{"line_number":234,"context_line":"            t \u003d threading.Timer(0, self._cleanup_cache)"},{"line_number":235,"context_line":"            t.start()"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _cleanup_cache(self):"},{"line_number":238,"context_line":"        LOG.debug(\u0027Cache cleanup: starting.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a57f1b5_b4fac541","line":235,"in_reply_to":"3a57f1b5_c38eb0cf","updated":"2016-02-11 20:29:06.000000000","message":"This will be best effort, single attempt clean up of image snapshots from the array. The thread will be short lived. I don\u0027t want it to be looping with interval. The cache cleanup will be called before updating array stats. Is there any other way of using eventlet threads?","commit_id":"b08bb6275fc1405ee1146fd5aa117c55602550de"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"b93f81d1513b730a342166dd22a3541ff5bd9e7b","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                        except Exception:"},{"line_number":257,"context_line":"                            LOG.warning(_LW(\u0027Unexpected exception during \u0027"},{"line_number":258,"context_line":"                                            \u0027cache cleanup of snapshot %s\u0027),"},{"line_number":259,"context_line":"                                        uuid)"},{"line_number":260,"context_line":"                else:"},{"line_number":261,"context_line":"                    LOG.debug(\u0027Cache cleanup: nothing to clean\u0027)"},{"line_number":262,"context_line":"        finally:"}],"source_content_type":"text/x-python","patch_set":4,"id":"dae33548_aa96afed","line":259,"updated":"2016-02-16 16:25:29.000000000","message":"I think you want to use LOG.exception here, otherwise you won\u0027t get a record of what failure occurred.","commit_id":"1848d7940e4fc996d53b87bc0f997a736f94e840"}]}
