private boolean isTransactional(Operation op) { return op != null && op.getTransactionId() != null && this.host.getTransactionServiceUri() != null; }
/** * Set the OperationContext associated with the thread based on the specified Operation * @param op Operation to build the OperationContext */ public static void setFrom(Operation op) { OperationContext currentOpCtx = threadOperationContext.get(); currentOpCtx.authContext = op.getAuthorizationContext(); currentOpCtx.transactionId = op.getTransactionId(); currentOpCtx.contextId = op.getContextId(); }
private String buildLogTransactionUpdateMsg(Operation request, ServiceDocument currentState) { return String.format( "Transaction %s set on service %s: operation: %s, previous transaction: %s", request.getTransactionId(), this.service.getSelfLink(), request.getAction(), currentState.documentTransactionId); }
private ClearTransactionRequest getIfClearTransactionRequest( Operation request) { if (request.getTransactionId() == null || !request.hasBody()) { return null; } try { ClearTransactionRequest op = request .getBody(ClearTransactionRequest.class); if (op == null || !Objects.equals(op.kind, ClearTransactionRequest.KIND)) { return null; } return op; } catch (Exception ex) { return null; } }
public static SerializedOperation create(Operation op) { SerializedOperation ctx = new SerializedOperation(); ctx.contextId = op.getContextId(); ctx.action = op.action; ctx.referer = op.getReferer(); ctx.id = op.id; ctx.statusCode = op.statusCode; ctx.options = op.options.clone(); ctx.transactionId = op.getTransactionId(); if (op.uri != null) { ctx.host = op.uri.getHost(); ctx.port = op.uri.getPort(); ctx.path = op.uri.getPath(); ctx.query = op.uri.getQuery(); ctx.userInfo = op.uri.getUserInfo(); } Object body = op.getBodyRaw(); if (body instanceof String) { ctx.jsonBody = (String) body; } else { ctx.jsonBody = Utils.toJson(body); } ctx.documentKind = KIND; ctx.documentExpirationTimeMicros = op.expirationMicrosUtc; return ctx; }
public void clearCachedServiceState(Service s, Operation op) { String servicePath = s.getSelfLink(); if (!isTransactional(op)) { AttachedServiceInfo serviceInfo = this.attachedServices.get(servicePath); if (serviceInfo != null) { synchronized (serviceInfo) { serviceInfo.cachedState = null; serviceInfo.lastAccessTime = 0; } } updateCacheClearStats(); return; } clearTransactionalCachedServiceState(servicePath, op.getTransactionId()); }
private void logTransactionConflict(Operation request, ServiceDocument currentState) { this.service .getHost() .log(Level.INFO, "Transaction %s conflicts on service %s: operation: %s, current state transaction: %s", request.getTransactionId(), this.service.getSelfLink(), request.getAction(), currentState.documentTransactionId); }
@Override public FilterReturnCode processRequest(Operation request, OperationProcessingContext context) { ClearTransactionRequest clearTransactionRequest = getIfClearTransactionRequest(request); // TODO: generalize transaction requests protocol through headers if (clearTransactionRequest != null) { FilterReturnCode rc = handleClearTransaction(request, this.service.getState(request), clearTransactionRequest, context); return rc; } if (validateTransactionConflictsAndMarkState(request, this.service.getState(request))) { request.fail(new IllegalStateException("transactional conflict")); return FilterReturnCode.FAILED_STOP_PROCESSING; } if (request.getTransactionId() != null) { context.setSuspendConsumer(o -> { handleEnrollInTransaction(request, context); }); return FilterReturnCode.SUSPEND_PROCESSING; } return FilterReturnCode.CONTINUE_PROCESSING; }
/** * Notify the transaction coordinator */ static Operation notifyTransactionCoordinatorOp(StatefulService s, Operation op, Throwable e) { URI txCoordinator = UriUtils.buildTransactionUri(s.getHost(), op.getTransactionId()); s.addPendingTransaction(txCoordinator.getPath()); Operation.TransactionContext operationsLogRecord = new Operation.TransactionContext(); operationsLogRecord.action = op.getAction(); operationsLogRecord.isSuccessful = e == null; Operation notifyCoordinatorOp = Operation.createPut(txCoordinator).setTransactionId(null); notifyCoordinatorOp.addRequestHeader(Operation.TRANSACTION_REFLINK_HEADER, s.getSelfLink()); return s.setPendingTransactionsAsBody(notifyCoordinatorOp, operationsLogRecord); }
op.getTransactionId()); state = this.cachedTransactionalServiceStates.get(key);
if (!request.getTransactionId().equals(currentState.documentTransactionId)) { if (clearTransactionRequest.transactionOutcome == TransactionOutcome.COMMIT) { String warning = String.format( "Request to clear transaction %s from service %s but current transaction is: %s", request.getTransactionId(), this.service.getSelfLink(), currentState.documentTransactionId); this.service.getHost().log(Level.WARNING, warning); this.service.getHost().log(Level.INFO, "Aborting transaction %s on service %s, current version %d, restoring version %d", request.getTransactionId(), this.service.getSelfLink(), currentState.documentVersion, clearTransactionRequest.originalVersion);
private boolean handleRequestCompletionSpecialCases(Operation op, Throwable e) { if (e != null) { if (hasOption(Service.ServiceOption.INSTRUMENTATION)) { adjustStat(op.getAction() + Service.STAT_NAME_FAILURE_COUNT, 1); } // operation has failed, complete and process any queued operations // If the request is in a transaction, notify the coordinator first. processCompletionStageTransactionNotification(op, e); return true; } if (op.getAction() == Action.DELETE && op.getTransactionId() == null && handleDeleteCompletion(op)) { return true; } if (op.getAction() == Action.OPTIONS) { handleOptionsCompletion(op); processPending(op); return true; } return false; }
String requestTransactionId = request.getTransactionId(); String currentStateTransactionId = currentState.documentTransactionId;
Operation enrollRequest = SimpleTransactionService.TxUtils .buildEnrollRequest(this.service.getHost(), request.getTransactionId(), serviceSelfLink, request.getAction(), servicePreviousVersion) .setCompletion(
private void verifyOp(Operation op, SerializedOperation sop) { assertEquals(op.getAction(), sop.action); assertEquals(op.getUri().getHost(), sop.host); assertEquals(op.getUri().getPort(), sop.port); assertEquals(op.getUri().getPath(), sop.path); assertEquals(op.getUri().getQuery(), sop.query); assertEquals(op.getId(), sop.id.longValue()); assertEquals(op.getReferer(), sop.referer); assertEquals(op.getBodyRaw(), sop.jsonBody); assertEquals(op.getStatusCode(), sop.statusCode); assertEquals(op.getOptions(), sop.options); assertEquals(op.getContextId(), sop.contextId); assertEquals(op.getTransactionId(), sop.transactionId); assertEquals(op.getUri().getUserInfo(), sop.userInfo); assertEquals(SerializedOperation.KIND, sop.documentKind); assertEquals(op.getExpirationMicrosUtc(), sop.documentExpirationTimeMicros); }
private void verifyOp(Operation op, SerializedOperation sop) { assertEquals(op.getAction(), sop.action); assertEquals(op.getUri().getHost(), sop.host); assertEquals(op.getUri().getPort(), sop.port); assertEquals(op.getUri().getPath(), sop.path); assertEquals(op.getUri().getQuery(), sop.query); assertEquals(op.getId(), sop.id.longValue()); assertEquals(op.getReferer(), sop.referer); assertEquals(op.getBodyRaw(), sop.jsonBody); assertEquals(op.getStatusCode(), sop.statusCode); assertEquals(op.getOptions(), sop.options); assertEquals(op.getContextId(), sop.contextId); assertEquals(op.getTransactionId(), sop.transactionId); assertEquals(op.getUri().getUserInfo(), sop.userInfo); assertEquals(SerializedOperation.KIND, sop.documentKind); assertEquals(op.getExpirationMicrosUtc(), sop.documentExpirationTimeMicros); }
initialState.documentTransactionId = o.getTransactionId(); if (hasChildOption(ServiceOption.IMMUTABLE)) {
if (get.isWithinTransaction()) { Operation inTransactionQueryOp = buildLatestInTransactionQueryTaskOp(s, get.getTransactionId(), authContext).setCompletion((o, e) -> { if (e != null) { get.fail(e);
state.documentTransactionId = op.getTransactionId();