def _query_parent_storage(self) -> storage.Storage: parent_storage = storage.query_by_ident(self.parent_ident) if not parent_storage: unconsumed = journal.query_unconsumed_create( self._params.journal_obj) for jn in unconsumed: if jn.new_ident == self.parent_ident and jn.is_qcow: """发现父快照还在日志表中,且父快照为qcow文件类型""" jn.append_child_storage_ident(self.new_ident) if jn.is_root: _logger.info( f'parent in journal and is root. <{jn.token}>') else: _logger.info( f'parent in journal and not root. _find_parent_in_storage. <{jn.token}>' ) parent_storage = self._find_parent_in_storage( unconsumed) break else: raise exc.generate_exception_and_logger( 'CDP快照存储父节点无效', f'journal {self._params.token} parent_ident invalid {self.parent_ident}, not in storage', 0) _logger.info(f'{self} _query_parent_storage : ({parent_storage})') return parent_storage
def _query_parent_storage(self) -> storage.Storage: parent_storage = storage.query_by_ident(self.parent_ident) if not parent_storage: raise exc.generate_exception_and_logger( 'QCOW快照存储父节点无效', f'journal {self._params.token} parent_ident invalid {self.parent_ident}, not in storage', 0) _logger.info(f'{self} _query_parent_storage : ({parent_storage})') return parent_storage
def _find_parent_in_storage( self, unconsumed: typing.List[journal.CreateInJournal] ) -> storage.Storage: first_in_journals = self._params _ = xf.DataHolder() while _.set(first_in_journals.query_parent_in_journals(unconsumed)): first_in_journals = _.get() st = storage.query_by_ident(first_in_journals.parent_ident) if st: return st else: raise exc.generate_exception_and_logger( 'CDP快照存储父节点无效', f'journal {self._params.token} parent_ident invalid {self.parent_ident}, not chain', 0)
def _deal_in_storage(self, ident) -> bool: st = storage.query_by_ident(ident) if not st: return False if st.status == m.SnapshotStorage.STATUS_STORAGE: st.update_status(m.SnapshotStorage.STATUS_RECYCLING) _logger.info( f'set [{st}] recycling. because destroy by {self._params.token}' ) return True elif st.status in ( m.SnapshotStorage.STATUS_ABNORMAL, m.SnapshotStorage.STATUS_DELETED, m.SnapshotStorage.STATUS_RECYCLING, ): _logger.warning(f'{ident} status is {st}, NOT update to RECYCLING') return True else: raise DestroyJournal.DelayDealException()
def _set_storage_status(self, status): with lm.get_storage_locker(self.trace_msg), s.transaction(): storage.query_by_ident(self.handle.storage_chain.last_storage_item. ident).update_status(status)
def _query_depend_nodes(self): tree_ident = storage.query_by_ident(self.storage_ident).tree_ident storage_tree = tree.generate(tree_ident) return storage_tree.fetch_nodes_to_root(self.storage_ident)
def save_work_result(self): if self.work_successful: storage.query_by_ident(self.storage_item.ident).update_status( m.SnapshotStorage.STATUS_DELETED) return self.work_successful