@Override public ReadConcern getReadConcern() { return wrapped.getReadConcern(); } }
private void updateSessionContext(final SessionContext sessionContext, final ResponseBuffers responseBuffers) { sessionContext.advanceOperationTime(getOperationTime(responseBuffers)); sessionContext.advanceClusterTime(getClusterTime(responseBuffers)); }
@Override public long advanceTransactionNumber() { return wrapped.advanceTransactionNumber(); }
private static boolean shouldAddAfterClusterTime(final SessionContext sessionContext) { return sessionContext.isCausallyConsistent() && sessionContext.getOperationTime() != null; }
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; }
public static BsonDocument getReadConcernDocument(final SessionContext sessionContext) { notNull("sessionContext", sessionContext); BsonDocument readConcernDocument = new BsonDocument(); ReadConcernLevel level = sessionContext.getReadConcern().getLevel(); if (level != null) { readConcernDocument.append("level", new BsonString(level.getValue())); } if (shouldAddAfterClusterTime(sessionContext)) { readConcernDocument.append("afterClusterTime", sessionContext.getOperationTime()); } return readConcernDocument; }
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 boolean hasActiveTransaction() { return wrapped.hasActiveTransaction(); }
command.put(getCommandName(batchType), new BsonString(namespace.getCollectionName())); command.put("ordered", new BsonBoolean(ordered)); if (!writeConcern.isServerDefault() && !sessionContext.hasActiveTransaction()) { command.put("writeConcern", writeConcern.asDocument()); command.put("txnNumber", new BsonInt64(sessionContext.advanceTransactionNumber()));
@Override public BsonTimestamp getOperationTime() { return wrapped.getOperationTime(); }
@Override public boolean hasSession() { return wrapped.hasSession(); }
@Override public void advanceClusterTime(final BsonDocument clusterTime) { wrapped.advanceClusterTime(clusterTime); clusterClock.advance(clusterTime); }
@Override public long getTransactionNumber() { return wrapped.getTransactionNumber(); }
@Override public void advanceOperationTime(final BsonTimestamp operationTime) { wrapped.advanceOperationTime(operationTime); }
@Override public BsonDocument getSessionId() { return wrapped.getSessionId(); }
@Override public BsonDocument getClusterTime() { return clusterClock.greaterOf(wrapped.getClusterTime()); }
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; }
public static BsonDocument getReadConcernDocument(final SessionContext sessionContext) { notNull("sessionContext", sessionContext); BsonDocument readConcernDocument = new BsonDocument(); ReadConcernLevel level = sessionContext.getReadConcern().getLevel(); if (level != null) { readConcernDocument.append("level", new BsonString(level.getValue())); } if (shouldAddAfterClusterTime(sessionContext)) { readConcernDocument.append("afterClusterTime", sessionContext.getOperationTime()); } return readConcernDocument; }
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); }
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); } }