def send_request_defer(self, data): defer = data.request.defer state = defer.state logger.info("handle sender defer: {}".format(state)) done = False if state == defer.BEGIN: pass elif state == defer.FLUSH_STATS: # NOTE: this is handled in handler.py:handle_request_defer() pass elif state == defer.FLUSH_TB: # NOTE: this is handled in handler.py:handle_request_defer() pass elif state == defer.FLUSH_SUM: # NOTE: this is handled in handler.py:handle_request_defer() pass elif state == defer.FLUSH_DIR: if self._dir_watcher: self._dir_watcher.finish() self._dir_watcher = None elif state == defer.FLUSH_FP: if self._pusher: self._pusher.finish() elif state == defer.FLUSH_FS: if self._fs: # TODO(jhr): now is a good time to output pending output lines self._fs.finish(self._exit_code) self._fs = None elif state == defer.FLUSH_FINAL: self._interface.publish_final() self._interface.publish_footer() elif state == defer.END: done = True else: raise AssertionError("unknown state") if not done: state += 1 logger.info("send defer: {}".format(state)) self._interface.publish_defer(state) return exit_result = wandb_internal_pb2.RunExitResult() # This path is not the prefered method to return exit results # as it could take a long time to flush the file pusher buffers if self._exit_sync_uuid: if self._pusher: # NOTE: This will block until finished self._pusher.print_status() self._pusher.join() self._pusher = None resp = wandb_internal_pb2.Result( exit_result=exit_result, uuid=self._exit_sync_uuid ) self._result_q.put(resp) # mark exit done in case we are polling on exit self._exit_result = exit_result
def RunExit( # noqa: N802 self, exit_data: pb.RunExitRecord, context: grpc.ServicerContext ) -> pb.RunExitResult: stream_id = exit_data._info.stream_id iface = self._mux.get_stream(stream_id).interface iface.publish_exit(exit_data.exit_code) result = pb.RunExitResult() return result
def send_request_defer(self, data): defer = data.request.defer state = defer.state logger.info("handle sender defer: {}".format(state)) def transition_state(): state = defer.state + 1 logger.info("send defer: {}".format(state)) self._interface.publish_defer(state) done = False if state == defer.BEGIN: transition_state() elif state == defer.FLUSH_STATS: # NOTE: this is handled in handler.py:handle_request_defer() transition_state() elif state == defer.FLUSH_TB: # NOTE: this is handled in handler.py:handle_request_defer() transition_state() elif state == defer.FLUSH_SUM: # NOTE: this is handled in handler.py:handle_request_defer() transition_state() elif state == defer.FLUSH_DEBOUNCER: self.debounce() transition_state() elif state == defer.FLUSH_DIR: if self._dir_watcher: self._dir_watcher.finish() self._dir_watcher = None transition_state() elif state == defer.FLUSH_FP: if self._pusher: # FilePusher generates some events for FileStreamApi, so we # need to wait for pusher to finish before going to the next # state to ensure that filestream gets all the events that we # want before telling it to finish up self._pusher.finish(transition_state) else: transition_state() elif state == defer.FLUSH_FS: if self._fs: # TODO(jhr): now is a good time to output pending output lines self._fs.finish(self._exit_code) self._fs = None transition_state() elif state == defer.FLUSH_FINAL: self._interface.publish_final() self._interface.publish_footer() transition_state() elif state == defer.END: done = True else: raise AssertionError("unknown state") if not done: return exit_result = wandb_internal_pb2.RunExitResult() # This path is not the prefered method to return exit results # as it could take a long time to flush the file pusher buffers if self._exit_sync_uuid: if self._pusher: # NOTE: This will block until finished self._pusher.print_status() self._pusher.join() self._pusher = None resp = wandb_internal_pb2.Result(exit_result=exit_result, uuid=self._exit_sync_uuid) self._result_q.put(resp) # mark exit done in case we are polling on exit self._exit_result = exit_result
def send_request_defer(self, record: "Record") -> None: defer = record.request.defer state = defer.state logger.info("handle sender defer: {}".format(state)) def transition_state() -> None: state = defer.state + 1 logger.info("send defer: {}".format(state)) self._interface.publish_defer(state) done = False if state == defer.BEGIN: transition_state() elif state == defer.FLUSH_STATS: # NOTE: this is handled in handler.py:handle_request_defer() transition_state() elif state == defer.FLUSH_TB: # NOTE: this is handled in handler.py:handle_request_defer() transition_state() elif state == defer.FLUSH_SUM: # NOTE: this is handled in handler.py:handle_request_defer() transition_state() elif state == defer.FLUSH_DEBOUNCER: self.debounce() transition_state() elif state == defer.FLUSH_DIR: if self._dir_watcher: self._dir_watcher.finish() self._dir_watcher = None transition_state() elif state == defer.FLUSH_FP: if self._pusher: # FilePusher generates some events for FileStreamApi, so we # need to wait for pusher to finish before going to the next # state to ensure that filestream gets all the events that we # want before telling it to finish up self._pusher.finish(transition_state) else: transition_state() elif state == defer.FLUSH_FS: if self._fs: # TODO(jhr): now is a good time to output pending output lines self._fs.finish(self._exit_code) self._fs = None transition_state() elif state == defer.FLUSH_FINAL: self._interface.publish_final() self._interface.publish_footer() transition_state() elif state == defer.END: done = True else: raise AssertionError("unknown state") if not done: return exit_result = wandb_internal_pb2.RunExitResult() # mark exit done in case we are polling on exit self._exit_result = exit_result