use of com.mongodb.ReplicaSetStatus in project jackrabbit-oak by apache.
the class MongoConnectionTest method mockDB.
private DB mockDB(ReadConcern r, WriteConcern w, boolean replicaSet) {
ReplicaSetStatus status;
if (replicaSet) {
status = mock(ReplicaSetStatus.class);
} else {
status = null;
}
DB db = mock(DB.class);
Mongo mongo = mock(Mongo.class);
when(db.getMongo()).thenReturn(mongo);
when(db.getWriteConcern()).thenReturn(w);
when(db.getReadConcern()).thenReturn(r);
when(mongo.getReplicaSetStatus()).thenReturn(status);
return db;
}
use of com.mongodb.ReplicaSetStatus in project debezium by debezium.
the class ConnectionContext method clientForPrimary.
/**
* Obtain a client that talks only to the primary node of the replica set.
*
* @param replicaSet the replica set information; may not be null
* @return the client, or {@code null} if no primary could be found for the replica set
*/
protected MongoClient clientForPrimary(ReplicaSet replicaSet) {
MongoClient replicaSetClient = clientForReplicaSet(replicaSet);
ReplicaSetStatus rsStatus = replicaSetClient.getReplicaSetStatus();
if (rsStatus == null) {
if (!this.useHostsAsSeeds) {
// No replica set status is available, but it may still be a replica set ...
return replicaSetClient;
}
// This is not a replica set, so there will be no oplog to read ...
throw new ConnectException("The MongoDB server(s) at '" + replicaSet + "' is not a valid replica set and cannot be used");
}
// It is a replica set ...
ServerAddress primaryAddress = rsStatus.getMaster();
if (primaryAddress != null) {
return pool.clientFor(primaryAddress);
}
return null;
}
use of com.mongodb.ReplicaSetStatus in project debezium by debezium.
the class ReplicaSetDiscovery method getReplicaSets.
/**
* Connect to the shard cluster or replica set defined by the seed addresses, and obtain the specifications for each of the
* replica sets.
*
* @return the information about the replica sets; never null but possibly empty
*/
public ReplicaSets getReplicaSets() {
MongoClient client = context.getConnectionContext().clientFor(seedAddresses);
Set<ReplicaSet> replicaSetSpecs = new HashSet<>();
// First see if the addresses are for a config server replica set ...
String shardsCollection = "shards";
try {
MongoUtil.onCollectionDocuments(client, CONFIG_DATABASE_NAME, shardsCollection, doc -> {
logger.info("Checking shard details from configuration replica set {}", seedAddresses);
String shardName = doc.getString("_id");
String hostStr = doc.getString("host");
String replicaSetName = MongoUtil.replicaSetUsedIn(hostStr);
replicaSetSpecs.add(new ReplicaSet(hostStr, replicaSetName, shardName));
});
} catch (MongoInterruptedException e) {
logger.error("Interrupted while reading the '{}' collection in the '{}' database: {}", shardsCollection, CONFIG_DATABASE_NAME, e.getMessage(), e);
Thread.currentThread().interrupt();
} catch (MongoException e) {
logger.error("Error while reading the '{}' collection in the '{}' database: {}", shardsCollection, CONFIG_DATABASE_NAME, e.getMessage(), e);
}
if (replicaSetSpecs.isEmpty()) {
// The addresses may be a replica set ...
ReplicaSetStatus rsStatus = client.getReplicaSetStatus();
logger.info("Checking current members of replica set at {}", seedAddresses);
if (rsStatus != null) {
// This is a replica set ...
String addressStr = Strings.join(",", client.getServerAddressList());
String replicaSetName = rsStatus.getName();
replicaSetSpecs.add(new ReplicaSet(addressStr, replicaSetName, null));
} else {
logger.debug("Found standalone MongoDB replica set at {}", seedAddresses);
// We aren't connecting to it as a replica set (likely not using auto-discovery of members),
// but we can't monitor standalone servers unless they really are replica sets. We already know
// that we're not connected to a config server replica set, so any replica set name from the seed addresses
// is almost certainly our replica set name ...
String replicaSetName = MongoUtil.replicaSetUsedIn(seedAddresses);
if (replicaSetName != null) {
for (String address : MongoUtil.ADDRESS_DELIMITER_PATTERN.split(seedAddresses)) {
replicaSetSpecs.add(new ReplicaSet(address, replicaSetName, null));
}
}
}
}
if (replicaSetSpecs.isEmpty()) {
// Without a replica set name, we can't do anything ...
logger.error("Found no replica sets at {}, so there is nothing to monitor and no connector tasks will be started. Check seed addresses in connector configuration.", seedAddresses);
}
return new ReplicaSets(replicaSetSpecs);
}
Aggregations