@Override public PingTxnStatus pingTxn(final String scope, final String stream, final UUID txnId, Version version, long lease) { if (!this.isRunning()) { return PingTxnStatus.newBuilder().setStatus(PingTxnStatus.Status.DISCONNECTED).build(); } final String key = getKey(scope, stream, txnId); Preconditions.checkState(map.containsKey(key), "Stream not found in the map"); final TxnData txnData = map.get(key); if (txnData == null) { throw new IllegalStateException(String.format("Transaction %s not added to timerWheelTimeoutService", txnId)); } if (lease > maxLeaseValue) { return PingTxnStatus.newBuilder().setStatus(PingTxnStatus.Status.LEASE_TOO_LARGE).build(); } if (lease + System.currentTimeMillis() > txnData.getMaxExecutionTimeExpiry()) { return PingTxnStatus.newBuilder().setStatus(PingTxnStatus.Status.MAX_EXECUTION_TIME_EXCEEDED).build(); } else { Timeout timeout = txnData.getTimeout(); boolean cancelSucceeded = timeout.cancel(); if (cancelSucceeded) { TxnData newTxnData = txnData.updateLease(scope, stream, txnId, version, lease); map.replace(key, txnData, newTxnData); return PingTxnStatus.newBuilder().setStatus(PingTxnStatus.Status.OK).build(); } else { // Cancellation may fail because timeout task (1) may be scheduled for execution, or (2) is executing. throw new IllegalStateException(String.format("Failed updating timeout for transaction %s", txnId)); } } }
@Override public void pingTransaction(PingTxnRequest request, StreamObserver<PingTxnStatus> responseObserver) { if (request.getStreamInfo().getStream().equals("stream1")) { responseObserver.onNext(PingTxnStatus.newBuilder().setStatus(PingTxnStatus.Status.OK).build()); responseObserver.onCompleted(); } else { responseObserver.onError(Status.INTERNAL.withDescription("Server error").asRuntimeException()); } }
@Override @Synchronized public CompletableFuture<PingTxnStatus> pingTxn(final String scope, final String stream, final UUID txId, final long lease, final OperationContext contextOpt) { final OperationContext context = contextOpt == null ? streamMetadataStore.createContext(scope, stream) : contextOpt; return streamMetadataStore.getTransactionData(scope, stream, txId, context, executor).thenComposeAsync(data -> streamMetadataStore.pingTransaction(scope, stream, data, lease, context, executor) .thenApply(txData -> { log.info("Pinged transaction {} with version {}", txId, txData.getVersion()); return PingTxnStatus.newBuilder().setStatus(Status.OK).build(); })); }
@Override public CompletableFuture<Void> pingTransaction(Stream stream, UUID txId, long lease) { Exceptions.checkNotClosed(closed.get(), this); long traceId = LoggerHelpers.traceEnter(log, "pingTransaction", stream, txId, lease); final CompletableFuture<PingTxnStatus> result = this.retryConfig.runAsync(() -> { RPCAsyncCallback<PingTxnStatus> callback = new RPCAsyncCallback<>(traceId, "pingTransaction"); client.pingTransaction(PingTxnRequest.newBuilder().setStreamInfo( ModelHelper.createStreamInfo(stream.getScope(), stream.getStreamName())) .setTxnId(ModelHelper.decode(txId)) .setLease(lease).build(), callback); return callback.getFuture(); }, this.executor); return Futures.toVoidExpecting(result, PingTxnStatus.newBuilder().setStatus(PingTxnStatus.Status.OK).build(), PingFailedException::new) .whenComplete((x, e) -> { if (e != null) { log.warn("pingTransaction failed: ", e); } LoggerHelpers.traceLeave(log, "pingTransaction", traceId); }); }
private PingTxnStatus createStatus(Status status) { return PingTxnStatus.newBuilder().setStatus(status).build(); }
@Override public CompletableFuture<Void> pingTransaction(Stream stream, UUID txId, long lease) { return Futures.toVoidExpecting( controller.pingTransaction(stream.getScope(), stream.getStreamName(), ModelHelper.decode(txId), lease), PingTxnStatus.newBuilder().setStatus(PingTxnStatus.Status.OK).build(), PingFailedException::new); }