Search in sources :

Example 1 with ReplicaSetStatus

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;
}
Also used : Mongo(com.mongodb.Mongo) ReplicaSetStatus(com.mongodb.ReplicaSetStatus) DB(com.mongodb.DB)

Example 2 with ReplicaSetStatus

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;
}
Also used : MongoClient(com.mongodb.MongoClient) ServerAddress(com.mongodb.ServerAddress) ReplicaSetStatus(com.mongodb.ReplicaSetStatus) ConnectException(org.apache.kafka.connect.errors.ConnectException)

Example 3 with ReplicaSetStatus

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);
}
Also used : MongoClient(com.mongodb.MongoClient) MongoException(com.mongodb.MongoException) MongoInterruptedException(com.mongodb.MongoInterruptedException) ReplicaSetStatus(com.mongodb.ReplicaSetStatus) HashSet(java.util.HashSet)

Aggregations

ReplicaSetStatus (com.mongodb.ReplicaSetStatus)3 MongoClient (com.mongodb.MongoClient)2 DB (com.mongodb.DB)1 Mongo (com.mongodb.Mongo)1 MongoException (com.mongodb.MongoException)1 MongoInterruptedException (com.mongodb.MongoInterruptedException)1 ServerAddress (com.mongodb.ServerAddress)1 HashSet (java.util.HashSet)1 ConnectException (org.apache.kafka.connect.errors.ConnectException)1