@Override public boolean hasActiveTransaction() { return wrapped.hasActiveTransaction(); }
static boolean isRetryableWrite(final boolean retryWrites, final WriteConcern writeConcern, final ServerDescription serverDescription, final ConnectionDescription connectionDescription, final SessionContext sessionContext) { if (!retryWrites) { return false; } else if (!writeConcern.isAcknowledged()) { LOGGER.debug("retryWrites set to true but the writeConcern is unacknowledged."); return false; } else if (sessionContext.hasActiveTransaction()) { LOGGER.debug("retryWrites set to true but in an active transaction."); return false; } else { return canRetryWrite(serverDescription, connectionDescription, sessionContext); } }
static void appendReadConcernToCommand(final SessionContext sessionContext, final BsonDocument commandDocument) { notNull("commandDocument", commandDocument); notNull("sessionContext", sessionContext); if (sessionContext.hasActiveTransaction()) { return; } BsonDocument readConcernDocument = getReadConcernDocument(sessionContext); if (!readConcernDocument.isEmpty()) { commandDocument.append("readConcern", readConcernDocument); } }
@Override public Void execute(final WriteBinding binding) { isTrue("in transaction", binding.getSessionContext().hasActiveTransaction()); return executeRetryableCommand(binding, "admin", null, new NoOpFieldNameValidator(), new BsonDocumentCodec(), getCommandCreator(), writeConcernErrorTransformer()); }
public static BulkWriteBatch createBulkWriteBatch(final MongoNamespace namespace, final ServerDescription serverDescription, final ConnectionDescription connectionDescription, final boolean ordered, final WriteConcern writeConcern, final Boolean bypassDocumentValidation, final boolean retryWrites, final List<? extends WriteRequest> writeRequests, final SessionContext sessionContext) { if (sessionContext.hasSession() && !sessionContext.isImplicitSession() && !sessionContext.hasActiveTransaction() && !writeConcern.isAcknowledged()) { throw new MongoClientException("Unacknowledged writes are not supported when using an explicit session"); } boolean canRetryWrites = isRetryableWrite(retryWrites, writeConcern, serverDescription, connectionDescription, sessionContext); List<WriteRequestWithIndex> writeRequestsWithIndex = new ArrayList<WriteRequestWithIndex>(); boolean writeRequestsAreRetryable = true; for (int i = 0; i < writeRequests.size(); i++) { WriteRequest writeRequest = writeRequests.get(i); writeRequestsAreRetryable = writeRequestsAreRetryable && isRetryable(writeRequest); writeRequestsWithIndex.add(new WriteRequestWithIndex(writeRequest, i)); } if (canRetryWrites && !writeRequestsAreRetryable) { canRetryWrites = false; LOGGER.debug("retryWrites set but one or more writeRequests do not support retryable writes"); } return new BulkWriteBatch(namespace, connectionDescription, ordered, writeConcern, bypassDocumentValidation, canRetryWrites, new BulkWriteBatchCombiner(connectionDescription.getServerAddress(), ordered, writeConcern), writeRequestsWithIndex, sessionContext); }
command.put(getCommandName(batchType), new BsonString(namespace.getCollectionName())); command.put("ordered", new BsonBoolean(ordered)); if (!writeConcern.isServerDefault() && !sessionContext.hasActiveTransaction()) { command.put("writeConcern", writeConcern.asDocument());
protected void addWriteConcernToCommand(final ConnectionDescription connectionDescription, final BsonDocument commandDocument, final SessionContext sessionContext) { if (getWriteConcern().isAcknowledged() && !getWriteConcern().isServerDefault() && serverIsAtLeastVersionThreeDotTwo(connectionDescription) && !sessionContext.hasActiveTransaction()) { commandDocument.put("writeConcern", getWriteConcern().asDocument()); } }
private List<BsonElement> getExtraElements(final SessionContext sessionContext) { List<BsonElement> extraElements = new ArrayList<BsonElement>(); extraElements.add(new BsonElement("$db", new BsonString(new MongoNamespace(getCollectionName()).getDatabaseName()))); if (sessionContext.getClusterTime() != null) { extraElements.add(new BsonElement("$clusterTime", sessionContext.getClusterTime())); } if (sessionContext.hasSession() && responseExpected) { extraElements.add(new BsonElement("lsid", sessionContext.getSessionId())); } boolean firstMessageInTransaction = sessionContext.notifyMessageSent(); if (sessionContext.hasActiveTransaction()) { checkServerVersionForTransactionSupport(); extraElements.add(new BsonElement("txnNumber", new BsonInt64(sessionContext.getTransactionNumber()))); if (firstMessageInTransaction) { extraElements.add(new BsonElement("startTransaction", BsonBoolean.TRUE)); addReadConcernDocument(extraElements, sessionContext); } extraElements.add(new BsonElement("autocommit", BsonBoolean.FALSE)); } if (readPreference != null) { if (!readPreference.equals(primary())) { extraElements.add(new BsonElement("$readPreference", readPreference.toDocument())); } else if (isDirectConnectionToNonShardRouter()) { extraElements.add(new BsonElement("$readPreference", primaryPreferred().toDocument())); } } return extraElements; }
@Override public void executeAsync(final AsyncWriteBinding binding, final SingleResultCallback<Void> callback) { isTrue("in transaction", binding.getSessionContext().hasActiveTransaction()); executeRetryableCommand(binding, "admin", null, new NoOpFieldNameValidator(), new BsonDocumentCodec(), getCommandCreator(), writeConcernErrorTransformer(), errorHandlingCallback(callback, LOGGER)); }
BsonDocument result = executeCommand(connection, currentBatch, binding); if (retryWrites && !binding.getSessionContext().hasActiveTransaction()) { MongoException writeConcernBasedError = ProtocolHelper.createSpecialException(result, connection.getDescription().getServerAddress(), "errMsg");
@Override public boolean hasActiveTransaction() { return wrapped.hasActiveTransaction(); }
static void appendReadConcernToCommand(final SessionContext sessionContext, final BsonDocument commandDocument) { notNull("commandDocument", commandDocument); notNull("sessionContext", sessionContext); if (sessionContext.hasActiveTransaction()) { return; } BsonDocument readConcernDocument = getReadConcernDocument(sessionContext); if (!readConcernDocument.isEmpty()) { commandDocument.append("readConcern", readConcernDocument); } }
static boolean isRetryableWrite(final boolean retryWrites, final WriteConcern writeConcern, final ServerDescription serverDescription, final ConnectionDescription connectionDescription, final SessionContext sessionContext) { if (!retryWrites) { return false; } else if (!writeConcern.isAcknowledged()) { LOGGER.debug("retryWrites set to true but the writeConcern is unacknowledged."); return false; } else if (sessionContext.hasActiveTransaction()) { LOGGER.debug("retryWrites set to true but in an active transaction."); return false; } else { return canRetryWrite(serverDescription, connectionDescription, sessionContext); } }
command.put(getCommandName(batchType), new BsonString(namespace.getCollectionName())); command.put("ordered", new BsonBoolean(ordered)); if (!writeConcern.isServerDefault() && !sessionContext.hasActiveTransaction()) { command.put("writeConcern", writeConcern.asDocument());
public static BulkWriteBatch createBulkWriteBatch(final MongoNamespace namespace, final ServerDescription serverDescription, final ConnectionDescription connectionDescription, final boolean ordered, final WriteConcern writeConcern, final Boolean bypassDocumentValidation, final boolean retryWrites, final List<? extends WriteRequest> writeRequests, final SessionContext sessionContext) { if (sessionContext.hasSession() && !sessionContext.isImplicitSession() && !sessionContext.hasActiveTransaction() && !writeConcern.isAcknowledged()) { throw new MongoClientException("Unacknowledged writes are not supported when using an explicit session"); } boolean canRetryWrites = isRetryableWrite(retryWrites, writeConcern, serverDescription, connectionDescription, sessionContext); List<WriteRequestWithIndex> writeRequestsWithIndex = new ArrayList<WriteRequestWithIndex>(); boolean writeRequestsAreRetryable = true; for (int i = 0; i < writeRequests.size(); i++) { WriteRequest writeRequest = writeRequests.get(i); writeRequestsAreRetryable = writeRequestsAreRetryable && isRetryable(writeRequest); writeRequestsWithIndex.add(new WriteRequestWithIndex(writeRequest, i)); } if (canRetryWrites && !writeRequestsAreRetryable) { canRetryWrites = false; LOGGER.debug("retryWrites set but one or more writeRequests do not support retryable writes"); } return new BulkWriteBatch(namespace, connectionDescription, ordered, writeConcern, bypassDocumentValidation, canRetryWrites, new BulkWriteBatchCombiner(connectionDescription.getServerAddress(), ordered, writeConcern), writeRequestsWithIndex, sessionContext); }
@Override public Void execute(final WriteBinding binding) { isTrue("in transaction", binding.getSessionContext().hasActiveTransaction()); return executeRetryableCommand(binding, "admin", null, new NoOpFieldNameValidator(), new BsonDocumentCodec(), getCommandCreator(), writeConcernErrorTransformer()); }
protected void addWriteConcernToCommand(final ConnectionDescription connectionDescription, final BsonDocument commandDocument, final SessionContext sessionContext) { if (getWriteConcern().isAcknowledged() && !getWriteConcern().isServerDefault() && serverIsAtLeastVersionThreeDotTwo(connectionDescription) && !sessionContext.hasActiveTransaction()) { commandDocument.put("writeConcern", getWriteConcern().asDocument()); } }
@Override public void executeAsync(final AsyncWriteBinding binding, final SingleResultCallback<Void> callback) { isTrue("in transaction", binding.getSessionContext().hasActiveTransaction()); executeRetryableCommand(binding, "admin", null, new NoOpFieldNameValidator(), new BsonDocumentCodec(), getCommandCreator(), writeConcernErrorTransformer(), errorHandlingCallback(callback, LOGGER)); }
private List<BsonElement> getExtraElements(final SessionContext sessionContext) { List<BsonElement> extraElements = new ArrayList<BsonElement>(); extraElements.add(new BsonElement("$db", new BsonString(new MongoNamespace(getCollectionName()).getDatabaseName()))); if (sessionContext.getClusterTime() != null) { extraElements.add(new BsonElement("$clusterTime", sessionContext.getClusterTime())); } if (sessionContext.hasSession() && responseExpected) { extraElements.add(new BsonElement("lsid", sessionContext.getSessionId())); } boolean firstMessageInTransaction = sessionContext.notifyMessageSent(); if (sessionContext.hasActiveTransaction()) { checkServerVersionForTransactionSupport(); extraElements.add(new BsonElement("txnNumber", new BsonInt64(sessionContext.getTransactionNumber()))); if (firstMessageInTransaction) { extraElements.add(new BsonElement("startTransaction", BsonBoolean.TRUE)); addReadConcernDocument(extraElements, sessionContext); } extraElements.add(new BsonElement("autocommit", BsonBoolean.FALSE)); } if (readPreference != null) { if (!readPreference.equals(primary())) { extraElements.add(new BsonElement("$readPreference", readPreference.toDocument())); } else if (isDirectConnectionToNonShardRouter()) { extraElements.add(new BsonElement("$readPreference", primaryPreferred().toDocument())); } } return extraElements; }
BsonDocument result = executeCommand(connection, currentBatch, binding); if (retryWrites && !binding.getSessionContext().hasActiveTransaction()) { MongoException writeConcernBasedError = ProtocolHelper.createSpecialException(result, connection.getDescription().getServerAddress(), "errMsg");