def update_transaction_state(self, transaction_id, status): transaction = self.__get_transaction(transaction_id) if transaction.get_transaction_type() == Transaction.TT_UPLOAD: if status == Transaction.TS_FINISHED: try: self.__save_metadata(transaction) except Exception, err: events_provider.critical( "Metadata", "Can't update metadata! Details: %s" % err) logger.traceback_info() return self.update_transaction_state( transaction_id, Transaction.TS_FAILED) elif status == Transaction.TS_FAILED: if transaction.get_status() != Transaction.TS_FAILED: events_provider.critical("Transaction", "File %s was not uploaded to NimbusFS backend!"%\ transaction.get_file_path()) #should be removed data block from backend replica_count = transaction.get_replica_count() for _, _, data_block, foreign_name in transaction.iter_data_blocks( ): self.__cancel_data_block_upload(foreign_name, data_block, replica_count) try: self.__metadata.cancel_item_id_reserve(transaction_id) except Exception, err: logger.warning("Can't cancel item_id=%s reserve" % transaction_id) logger.traceback_info()
def __failed_transaction(self, err): self.__failed_flag = True events_provider.critical("File", "File %s IO error: %s"%\ (self.__file_path, err)) if self.__cur_data_block: self.__cur_data_block.remove() if self.__transaction_id: self.TRANSACTIONS_MANAGER.update_transaction_state(self.__transaction_id, Transaction.TS_FAILED)
def __failed_transaction(self, err): self.__failed_flag = True events_provider.critical("File", "File %s IO error: %s"%\ (self.__file_path, err)) if self.__cur_data_block: self.__cur_data_block.remove() if self.__transaction_id: self.TRANSACTIONS_MANAGER.update_transaction_state( self.__transaction_id, Transaction.TS_FAILED)
def run(self): while True: job = self.queue.get() transaction = None data_block = None key = None try: if job == QUIT_JOB or self.stop_flag.is_set(): break transaction, seek = job data_block, _, _ = transaction.get_data_block(seek) if not data_block.exists(): raise Exception( 'Data block %s does not found at local cache!' % data_block.get_name()) try: key = self.fabnet_gateway.put(data_block, replica_count=transaction.get_replica_count(), \ allow_rewrite=False) except Exception, err: logger.error('Put data block error: %s' % err) logger.error('Cant put data block from file %s. Wait %s seconds and try again...'%\ (transaction.get_file_path(), FG_ERROR_TIMEOUT)) time.sleep(FG_ERROR_TIMEOUT) data_block.reopen() self.queue.put(job) continue data_block.close() self.transactions_manager.update_transaction( transaction.get_id(), seek, is_failed=False, foreign_name=key) except Exception, err: events_provider.critical('PutWorker', '%s failed: %s' % (transaction, err)) logger.traceback_debug() try: if transaction: self.transactions_manager.update_transaction(transaction.get_id(), seek, \ is_failed=True) except Exception, err: logger.error('[PutWorker.__on_error] %s' % err) logger.traceback_debug()
def run(self): while True: job = self.queue.get() transaction = None data_block = None key = None try: if job == QUIT_JOB or self.stop_flag.is_set(): break transaction, seek = job data_block,_,_ = transaction.get_data_block(seek) if not data_block.exists(): raise Exception('Data block %s does not found at local cache!'%data_block.get_name()) try: key = self.fabnet_gateway.put(data_block, replica_count=transaction.get_replica_count(), \ allow_rewrite=False) except Exception, err: logger.error('Put data block error: %s'%err) logger.error('Cant put data block from file %s. Wait %s seconds and try again...'%\ (transaction.get_file_path(), FG_ERROR_TIMEOUT)) time.sleep(FG_ERROR_TIMEOUT) data_block.reopen() self.queue.put(job) continue data_block.close() self.transactions_manager.update_transaction(transaction.get_id(), seek, is_failed=False, foreign_name=key) except Exception, err: events_provider.critical('PutWorker', '%s failed: %s'%(transaction, err)) logger.traceback_debug() try: if transaction: self.transactions_manager.update_transaction(transaction.get_id(), seek, \ is_failed=True) except Exception, err: logger.error('[PutWorker.__on_error] %s'%err) logger.traceback_debug()
def update_transaction_state(self, transaction_id, status): transaction = self.__get_transaction(transaction_id) if transaction.get_transaction_type() == Transaction.TT_UPLOAD: if status == Transaction.TS_FINISHED: try: self.__save_metadata(transaction) except Exception, err: events_provider.critical("Metadata", "Can't update metadata! Details: %s"%err) logger.traceback_info() return self.update_transaction_state(transaction_id, Transaction.TS_FAILED) elif status == Transaction.TS_FAILED: if transaction.get_status() != Transaction.TS_FAILED: events_provider.critical("Transaction", "File %s was not uploaded to NimbusFS backend!"%\ transaction.get_file_path()) #should be removed data block from backend replica_count = transaction.get_replica_count() for _,_,data_block, foreign_name in transaction.iter_data_blocks(): self.__cancel_data_block_upload(foreign_name, data_block, replica_count) try: self.__metadata.cancel_item_id_reserve(transaction_id) except Exception, err: logger.warning("Can't cancel item_id=%s reserve"%transaction_id) logger.traceback_info()