def _future_timeout_checker_thread(running_futures, internal_storage, throw_except): should_run = True while should_run: try: while True: current_time = time.time() for fut in running_futures: if fut.running and fut._call_status: fut_timeout = fut._call_status[ 'start_time'] + fut.execution_timeout + 5 if current_time > fut_timeout: msg = 'The function did not run as expected.' raise TimeoutError('HANDLER', msg) time.sleep(5) except TimeoutError: # generate fake TimeoutError call status pickled_exception = str(pickle.dumps(sys.exc_info())) call_status = { 'type': '__end__', 'exception': True, 'exc_info': pickled_exception, 'executor_id': fut.executor_id, 'job_id': fut.job_id, 'call_id': fut.call_id, 'activation_id': fut.activation_id } status_key = create_status_key(JOBS_PREFIX, fut.executor_id, fut.job_id, fut.call_id) dmpd_response_status = json.dumps(call_status) internal_storage.put_data(status_key, dmpd_response_status) if throw_except: should_run = False except Exception: time.sleep(5)
def get_call_status(self, executor_id, job_id, call_id): """ Get status of a call. :param executor_id: executor ID of the call :param call_id: call ID of the call :return: A dictionary containing call's status, or None if no updated status """ status_key = create_status_key(executor_id, job_id, call_id) try: data = self.storage.get_object(self.bucket, status_key) return json.loads(data.decode('ascii')) except StorageNoSuchKeyError: return None
def _send_status_os(self): """ Send the status event to the Object Storage """ executor_id = self.response['executor_id'] job_id = self.response['job_id'] call_id = self.response['call_id'] act_id = self.response['activation_id'] if self.response['type'] == '__init__': init_key = create_init_key(JOBS_PREFIX, executor_id, job_id, call_id, act_id) self.internal_storage.put_data(init_key, '') elif self.response['type'] == '__end__': status_key = create_status_key(JOBS_PREFIX, executor_id, job_id, call_id) dmpd_response_status = json.dumps(self.response) drs = sizeof_fmt(len(dmpd_response_status)) logger.info("Storing execution stats - Size: {}".format(drs)) self.internal_storage.put_data(status_key, dmpd_response_status)