All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gravity9.mongocse.ConfigManager Maven / Gradle / Ivy

package com.gravity9.mongocse;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;

import java.util.List;
import java.util.Optional;
import org.bson.types.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class ConfigManager {

	private static final Logger log = LoggerFactory.getLogger(ConfigManager.class);

	private final MongoCollection workerConfigCollection;

	private final MongoCollection clusterConfigCollection;

	ConfigManager(MongoConfig mongoConfig, MongoClientProvider clientProvider) {
		MongoDatabase db = clientProvider.getClient().getDatabase(mongoConfig.getDatabaseName());
		workerConfigCollection = db.getCollection(mongoConfig.getWorkerConfigCollectionName(), ChangeStreamWorkerConfig.class);
		clusterConfigCollection = db.getCollection(mongoConfig.getClusterConfigCollectionName(), WorkerClusterConfig.class);
	}

	void verifyClusterConfig(String collectionName, Integer partitions) {
		WorkerClusterConfig clusterConfig = findConfig(collectionName).orElse(null);
		if (clusterConfig == null) {
			return;
		}

		if (clusterConfig.getPartitions() == partitions) {
			return;
		}

		String message = String.format(
			"Found previous config for collection %s with different number of partitions! In existing config: %d, in requested config: %d",
			collectionName,
			clusterConfig.getPartitions(),
			partitions
		);

		throw new IllegalArgumentException(message);
	}

	WorkerClusterConfig getOrInitClusterConfig(String collectionName, Integer partitions) {
		return findConfig(collectionName)
			.orElseGet(() -> {
				log.info("Creating new cluster config for collection {}", collectionName);
				var clusterConfig = new WorkerClusterConfig();
				clusterConfig.setCollection(collectionName);
				clusterConfig.setPartitions(partitions);
				clusterConfigCollection.insertOne(clusterConfig);
				return findConfig(collectionName).orElseThrow(() -> new IllegalStateException("Could not create config for collection: " + collectionName));
			});
	}

	private Optional findConfig(String collectionName) {
		return Optional.ofNullable(clusterConfigCollection.find(Filters.and(List.of(
			Filters.eq("collection", collectionName)
		))).first());
	}

	ChangeStreamWorkerConfig getConfigOrInit(String listenedCollection, Integer partition) {
		ChangeStreamWorkerConfig changeStreamWorkerConfig = workerConfigCollection.find(Filters.and(List.of(
			Filters.eq("collection", listenedCollection),
			Filters.eq("partition", partition)
		))).first();

		if (changeStreamWorkerConfig == null) {
			log.info("Creating new config for partition {} on collection {}", partition, listenedCollection);
			changeStreamWorkerConfig = new ChangeStreamWorkerConfig();
			changeStreamWorkerConfig.setCollection(listenedCollection);
			changeStreamWorkerConfig.setPartition(partition);

			workerConfigCollection.insertOne(changeStreamWorkerConfig);

			changeStreamWorkerConfig = workerConfigCollection.find(Filters.and(List.of(
				Filters.eq("collection", listenedCollection),
				Filters.eq("partition", partition)
			))).first();
		}

		return changeStreamWorkerConfig;
	}

	ChangeStreamWorkerConfig updateResumeToken(ObjectId id, String resumeToken) {
		workerConfigCollection.updateOne(
			Filters.eq("_id", id),
			Updates.set("resumeToken", resumeToken)
		);

		return workerConfigCollection.find(Filters.eq("_id")).first();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy