Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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()
Ejemplo n.º 5
0
    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()