def _check_state(): """Check that the worker's state is consistent with the host's knowledge.""" try: status = stub().GetStatus(untrusted_runner_pb2.GetStatusRequest(), timeout=config.GET_STATUS_TIMEOUT_SECONDS) except grpc.RpcError: logs.log_error('GetStatus failed.') return False if status.revision != utils.current_source_version(): logs.log_warn( 'Mismatching source revision: %s (host) vs %s (worker).' % (utils.current_source_version(), status.revision)) return False if _host_state.worker_bot_name != status.bot_name: logs.log_warn('Worker bot name invalid (IP changed?).') return False if _host_state.worker_start_time: if _host_state.worker_start_time == status.start_time: return True logs.log_warn('Worker start time changed.') return False _host_state.worker_start_time = status.start_time return True
def update_heartbeat(force_update=False): """Updates heartbeat with current timestamp and log data.""" # Check if the heartbeat was recently updated. If yes, bail out. last_modified_time = persistent_cache.get_value( HEARTBEAT_LAST_UPDATE_KEY, constructor=datetime.datetime.utcfromtimestamp) if (not force_update and last_modified_time and not dates.time_has_expired( last_modified_time, seconds=data_types.HEARTBEAT_WAIT_INTERVAL)): return 0 bot_name = environment.get_value('BOT_NAME') current_time = datetime.datetime.utcnow() try: heartbeat = ndb.Key(data_types.Heartbeat, bot_name).get() if not heartbeat: heartbeat = data_types.Heartbeat() heartbeat.bot_name = bot_name heartbeat.key = ndb.Key(data_types.Heartbeat, bot_name) heartbeat.task_payload = tasks.get_task_payload() heartbeat.task_end_time = tasks.get_task_end_time() heartbeat.last_beat_time = current_time heartbeat.source_version = utils.current_source_version() heartbeat.put() persistent_cache.set_value( HEARTBEAT_LAST_UPDATE_KEY, time.time(), persist_across_reboots=True) except: logs.log_error('Unable to update heartbeat.') return 0 return 1
def get_local_source_revision(): """Return the local source revision.""" return utils.current_source_version()
def GetStatus(self, request, context): # pylint: disable=unused-argument return untrusted_runner_pb2.GetStatusResponse( revision=utils.current_source_version(), start_time=_worker_state.start_time, bot_name=environment.get_value('BOT_NAME'))