code: CompletableFuture<PingTxnStatus> pingTxnBody(final String scope,
                                                   final String stream,
                                                   final UUID txnId,
                                                   final long lease,
                                                   final OperationContext ctx) {
          if (!timeoutService.isRunning()) {
              return CompletableFuture.completedFuture(createStatus(Status.DISCONNECTED));
          }
  
          log.debug("Txn={}, updating txn node in store and extending lease", txnId);
          return fenceTxnUpdateLease(scope, stream, txnId, lease, ctx);
      }
docs: Ping a txn thereby updating its timeout to current time + lease.
  
  Post-condition:
  1. If ping request completes successfully, then
  (a) txn timeout is set to lease + current time in timeout service,
  (b) txn version in timeout service equals version of txn node in store,
  (c) if txn's timeout was not previously tracked in timeout service of current process,
  then version of txn node in store is updated, thus fencing out other processes tracking timeout for this txn,
  (d) txn is present in the host-txn index of current host,
  
  2. If process fails before responding to the client, then since txn is present in the host-txn index,
  some other controller process shall abort the txn after maxLeaseValue
  
  Store read/update operation is not invoked on receiving ping request for a txn that is being tracked in the
  timeout service. Otherwise, if the txn is not being tracked in the timeout service, txn node is read from
  the store and updated.
  
  @param scope      scope name.
  @param stream     stream name.
  @param txnId      txn id.
  @param lease      txn lease.
  @param ctx        context.
  @return           ping status.