class_docstr: A gRPC service server for updating remote job info to MLMD.
  
  Attributes:
    local_address: Local network address to the server.
    address: Remote network address to the server, same as local_address if not
             configured.
class_docstr_tok: ["A","gRPC","service","server","for","updating","remote","job","info","to","MLMD",".","Attributes",":","local_address",":","Local","network","address","to","the","server",".","address",":","Remote","network","address","to","the","server",",","same","as","local_address","if","not","configured","."]
docstr: Updates the `custom_properties` field of Execution object in MLMD.
docstr_tok: ["Updates","the","`","custom_properties","`","field","of","Execution","object","in","MLMD","."]
code: def UpdateExecutionInfo(
      self,
      request: execution_watcher_pb2.UpdateExecutionInfoRequest,
      context: grpc.ServicerContext,
  ) -> execution_watcher_pb2.UpdateExecutionInfoResponse:
      """Updates the `custom_properties` field of Execution object in MLMD."""
      logging.info(
          "Received request to update execution info: updates %s, "
          "execution_id %s",
          request.updates,
          request.execution_id,
      )
      if request.execution_id != self._execution.id:
          context.set_code(grpc.StatusCode.NOT_FOUND)
          context.set_details(
              "Execution with given execution_id not tracked by server: "
              f"{request.execution_id}"
          )
          return execution_watcher_pb2.UpdateExecutionInfoResponse()
      for key, value in request.updates.items():
          self._execution.custom_properties[key].CopyFrom(value)
      # Only the execution is needed
      with self._mlmd_connection as m:
          m.store.put_executions((self._execution,))
      return execution_watcher_pb2.UpdateExecutionInfoResponse()
  
file_path: tfx/tfx/orchestration/portable/execution_watcher.py
imports: from concurrent import futures
  from typing import Optional
  from absl import logging
  import grpc
  from tfx.orchestration import metadata
  from tfx.proto.orchestration import execution_watcher_pb2
  from tfx.proto.orchestration import execution_watcher_pb2_grpc
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling the ExecutionWatcher obj's underlying member method code with example usage: obj.UpdateExecutionInfo(request, context) and returns: execution_watcher_pb2, execution_watcher_pb2