2 * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.datastore;
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
13 import akka.util.Timeout;
14 import com.google.common.annotations.VisibleForTesting;
16 import java.util.concurrent.ConcurrentHashMap;
17 import java.util.concurrent.TimeUnit;
18 import org.apache.commons.text.WordUtils;
19 import org.opendaylight.controller.cluster.access.client.AbstractClientConnection;
20 import org.opendaylight.controller.cluster.access.client.ClientActorConfig;
21 import org.opendaylight.controller.cluster.common.actor.AkkaConfigurationReader;
22 import org.opendaylight.controller.cluster.common.actor.FileAkkaConfigurationReader;
23 import org.opendaylight.controller.cluster.raft.ConfigParams;
24 import org.opendaylight.controller.cluster.raft.DefaultConfigParamsImpl;
25 import org.opendaylight.controller.cluster.raft.PeerAddressResolver;
26 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30 import scala.concurrent.duration.FiniteDuration;
33 * Contains contextual data for a data store.
35 * @author Thomas Pantelis
37 // Non-final for mocking
38 public class DatastoreContext implements ClientActorConfig {
39 public static final String METRICS_DOMAIN = "org.opendaylight.controller.cluster.datastore";
41 public static final FiniteDuration DEFAULT_SHARD_TRANSACTION_IDLE_TIMEOUT = FiniteDuration.create(10,
43 public static final int DEFAULT_OPERATION_TIMEOUT_IN_MS = 5000;
44 public static final int DEFAULT_SHARD_TX_COMMIT_TIMEOUT_IN_SECONDS = 30;
45 public static final int DEFAULT_JOURNAL_RECOVERY_BATCH_SIZE = 1;
46 public static final int DEFAULT_SNAPSHOT_BATCH_COUNT = 20000;
47 public static final int DEFAULT_RECOVERY_SNAPSHOT_INTERVAL_SECONDS = 0;
48 public static final int DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS = 500;
49 public static final int DEFAULT_ISOLATED_LEADER_CHECK_INTERVAL_IN_MILLIS =
50 DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS * 10;
51 public static final int DEFAULT_SHARD_TX_COMMIT_QUEUE_CAPACITY = 50000;
52 public static final Timeout DEFAULT_SHARD_INITIALIZATION_TIMEOUT = new Timeout(5, TimeUnit.MINUTES);
53 public static final Timeout DEFAULT_SHARD_LEADER_ELECTION_TIMEOUT = new Timeout(30, TimeUnit.SECONDS);
54 public static final int DEFAULT_INITIAL_SETTLE_TIMEOUT_MULTIPLIER = 3;
55 public static final boolean DEFAULT_PERSISTENT = true;
56 public static final boolean DEFAULT_SNAPSHOT_ON_ROOT_OVERWRITE = false;
57 public static final FileAkkaConfigurationReader DEFAULT_CONFIGURATION_READER = new FileAkkaConfigurationReader();
58 public static final int DEFAULT_SHARD_SNAPSHOT_DATA_THRESHOLD_PERCENTAGE = 12;
59 public static final int DEFAULT_SHARD_ELECTION_TIMEOUT_FACTOR = 2;
60 public static final int DEFAULT_SHARD_CANDIDATE_ELECTION_TIMEOUT_DIVISOR = 1;
61 public static final int DEFAULT_TX_CREATION_INITIAL_RATE_LIMIT = 100;
62 public static final String UNKNOWN_DATA_STORE_TYPE = "unknown";
63 public static final int DEFAULT_SHARD_BATCHED_MODIFICATION_COUNT = 1000;
64 public static final long DEFAULT_SHARD_COMMIT_QUEUE_EXPIRY_TIMEOUT_IN_MS =
65 TimeUnit.MILLISECONDS.convert(2, TimeUnit.MINUTES);
66 public static final int DEFAULT_MAX_MESSAGE_SLICE_SIZE = 2048 * 1000; // 2MB
67 public static final int DEFAULT_INITIAL_PAYLOAD_SERIALIZED_BUFFER_CAPACITY = 512;
69 public static final long DEFAULT_SYNC_INDEX_THRESHOLD = 10;
71 private static final Logger LOG = LoggerFactory.getLogger(DatastoreContext.class);
73 private static final Set<String> GLOBAL_DATASTORE_NAMES = ConcurrentHashMap.newKeySet();
75 private final DefaultConfigParamsImpl raftConfig = new DefaultConfigParamsImpl();
77 private FiniteDuration shardTransactionIdleTimeout = DatastoreContext.DEFAULT_SHARD_TRANSACTION_IDLE_TIMEOUT;
78 private long operationTimeoutInMillis = DEFAULT_OPERATION_TIMEOUT_IN_MS;
79 private String dataStoreMXBeanType;
80 private int shardTransactionCommitTimeoutInSeconds = DEFAULT_SHARD_TX_COMMIT_TIMEOUT_IN_SECONDS;
81 private int shardTransactionCommitQueueCapacity = DEFAULT_SHARD_TX_COMMIT_QUEUE_CAPACITY;
82 private Timeout shardInitializationTimeout = DEFAULT_SHARD_INITIALIZATION_TIMEOUT;
83 private Timeout shardLeaderElectionTimeout = DEFAULT_SHARD_LEADER_ELECTION_TIMEOUT;
84 private int initialSettleTimeoutMultiplier = DEFAULT_INITIAL_SETTLE_TIMEOUT_MULTIPLIER;
85 private boolean persistent = DEFAULT_PERSISTENT;
86 private boolean snapshotOnRootOverwrite = DEFAULT_SNAPSHOT_ON_ROOT_OVERWRITE;
87 private AkkaConfigurationReader configurationReader = DEFAULT_CONFIGURATION_READER;
88 private long transactionCreationInitialRateLimit = DEFAULT_TX_CREATION_INITIAL_RATE_LIMIT;
89 private String dataStoreName = UNKNOWN_DATA_STORE_TYPE;
90 private LogicalDatastoreType logicalStoreType = LogicalDatastoreType.OPERATIONAL;
91 private YangInstanceIdentifier storeRoot = YangInstanceIdentifier.empty();
92 private int shardBatchedModificationCount = DEFAULT_SHARD_BATCHED_MODIFICATION_COUNT;
93 private boolean writeOnlyTransactionOptimizationsEnabled = true;
94 private long shardCommitQueueExpiryTimeoutInMillis = DEFAULT_SHARD_COMMIT_QUEUE_EXPIRY_TIMEOUT_IN_MS;
95 private boolean useTellBasedProtocol = false;
96 private boolean transactionDebugContextEnabled = false;
97 private String shardManagerPersistenceId;
98 private int maximumMessageSliceSize = DEFAULT_MAX_MESSAGE_SLICE_SIZE;
99 private long backendAlivenessTimerInterval = AbstractClientConnection.DEFAULT_BACKEND_ALIVE_TIMEOUT_NANOS;
100 private long requestTimeout = AbstractClientConnection.DEFAULT_REQUEST_TIMEOUT_NANOS;
101 private long noProgressTimeout = AbstractClientConnection.DEFAULT_NO_PROGRESS_TIMEOUT_NANOS;
102 private int initialPayloadSerializedBufferCapacity = DEFAULT_INITIAL_PAYLOAD_SERIALIZED_BUFFER_CAPACITY;
103 private boolean useLz4Compression = false;
105 public static Set<String> getGlobalDatastoreNames() {
106 return GLOBAL_DATASTORE_NAMES;
110 setShardJournalRecoveryLogBatchSize(DEFAULT_JOURNAL_RECOVERY_BATCH_SIZE);
111 setSnapshotBatchCount(DEFAULT_SNAPSHOT_BATCH_COUNT);
112 setRecoverySnapshotIntervalSeconds(DEFAULT_RECOVERY_SNAPSHOT_INTERVAL_SECONDS);
113 setHeartbeatInterval(DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS);
114 setIsolatedLeaderCheckInterval(DEFAULT_ISOLATED_LEADER_CHECK_INTERVAL_IN_MILLIS);
115 setSnapshotDataThresholdPercentage(DEFAULT_SHARD_SNAPSHOT_DATA_THRESHOLD_PERCENTAGE);
116 setElectionTimeoutFactor(DEFAULT_SHARD_ELECTION_TIMEOUT_FACTOR);
117 setCandidateElectionTimeoutDivisor(DEFAULT_SHARD_CANDIDATE_ELECTION_TIMEOUT_DIVISOR);
118 setSyncIndexThreshold(DEFAULT_SYNC_INDEX_THRESHOLD);
119 setMaximumMessageSliceSize(DEFAULT_MAX_MESSAGE_SLICE_SIZE);
122 private DatastoreContext(final DatastoreContext other) {
123 this.shardTransactionIdleTimeout = other.shardTransactionIdleTimeout;
124 this.operationTimeoutInMillis = other.operationTimeoutInMillis;
125 this.dataStoreMXBeanType = other.dataStoreMXBeanType;
126 this.shardTransactionCommitTimeoutInSeconds = other.shardTransactionCommitTimeoutInSeconds;
127 this.shardTransactionCommitQueueCapacity = other.shardTransactionCommitQueueCapacity;
128 this.shardInitializationTimeout = other.shardInitializationTimeout;
129 this.shardLeaderElectionTimeout = other.shardLeaderElectionTimeout;
130 this.initialSettleTimeoutMultiplier = other.initialSettleTimeoutMultiplier;
131 this.persistent = other.persistent;
132 this.snapshotOnRootOverwrite = other.snapshotOnRootOverwrite;
133 this.configurationReader = other.configurationReader;
134 this.transactionCreationInitialRateLimit = other.transactionCreationInitialRateLimit;
135 this.dataStoreName = other.dataStoreName;
136 this.logicalStoreType = other.logicalStoreType;
137 this.storeRoot = other.storeRoot;
138 this.shardBatchedModificationCount = other.shardBatchedModificationCount;
139 this.writeOnlyTransactionOptimizationsEnabled = other.writeOnlyTransactionOptimizationsEnabled;
140 this.shardCommitQueueExpiryTimeoutInMillis = other.shardCommitQueueExpiryTimeoutInMillis;
141 this.transactionDebugContextEnabled = other.transactionDebugContextEnabled;
142 this.shardManagerPersistenceId = other.shardManagerPersistenceId;
143 this.useTellBasedProtocol = other.useTellBasedProtocol;
144 this.backendAlivenessTimerInterval = other.backendAlivenessTimerInterval;
145 this.requestTimeout = other.requestTimeout;
146 this.noProgressTimeout = other.noProgressTimeout;
147 this.initialPayloadSerializedBufferCapacity = other.initialPayloadSerializedBufferCapacity;
148 this.useLz4Compression = other.useLz4Compression;
150 setShardJournalRecoveryLogBatchSize(other.raftConfig.getJournalRecoveryLogBatchSize());
151 setSnapshotBatchCount(other.raftConfig.getSnapshotBatchCount());
152 setRecoverySnapshotIntervalSeconds(other.raftConfig.getRecoverySnapshotIntervalSeconds());
153 setHeartbeatInterval(other.raftConfig.getHeartBeatInterval().toMillis());
154 setIsolatedLeaderCheckInterval(other.raftConfig.getIsolatedCheckIntervalInMillis());
155 setSnapshotDataThresholdPercentage(other.raftConfig.getSnapshotDataThresholdPercentage());
156 setElectionTimeoutFactor(other.raftConfig.getElectionTimeoutFactor());
157 setCandidateElectionTimeoutDivisor(other.raftConfig.getCandidateElectionTimeoutDivisor());
158 setCustomRaftPolicyImplementation(other.raftConfig.getCustomRaftPolicyImplementationClass());
159 setMaximumMessageSliceSize(other.getMaximumMessageSliceSize());
160 setShardSnapshotChunkSize(other.raftConfig.getSnapshotChunkSize());
161 setPeerAddressResolver(other.raftConfig.getPeerAddressResolver());
162 setTempFileDirectory(other.getTempFileDirectory());
163 setFileBackedStreamingThreshold(other.getFileBackedStreamingThreshold());
164 setSyncIndexThreshold(other.raftConfig.getSyncIndexThreshold());
167 public static Builder newBuilder() {
168 return new Builder(new DatastoreContext());
171 public static Builder newBuilderFrom(final DatastoreContext context) {
172 return new Builder(new DatastoreContext(context));
175 public FiniteDuration getShardTransactionIdleTimeout() {
176 return shardTransactionIdleTimeout;
179 public String getDataStoreMXBeanType() {
180 return dataStoreMXBeanType;
183 public long getOperationTimeoutInMillis() {
184 return operationTimeoutInMillis;
187 public ConfigParams getShardRaftConfig() {
191 public int getShardTransactionCommitTimeoutInSeconds() {
192 return shardTransactionCommitTimeoutInSeconds;
195 public int getShardTransactionCommitQueueCapacity() {
196 return shardTransactionCommitQueueCapacity;
199 public Timeout getShardInitializationTimeout() {
200 return shardInitializationTimeout;
203 public Timeout getShardLeaderElectionTimeout() {
204 return shardLeaderElectionTimeout;
208 * Return the multiplier of {@link #getShardLeaderElectionTimeout()} which the frontend will wait for all shards
209 * on the local node to settle.
211 * @return Non-negative multiplier. Value of {@code 0} indicates to wait indefinitely.
213 public int getInitialSettleTimeoutMultiplier() {
214 return initialSettleTimeoutMultiplier;
217 public boolean isPersistent() {
221 public boolean isSnapshotOnRootOverwrite() {
222 return this.snapshotOnRootOverwrite;
225 public AkkaConfigurationReader getConfigurationReader() {
226 return configurationReader;
229 public long getShardElectionTimeoutFactor() {
230 return raftConfig.getElectionTimeoutFactor();
233 public String getDataStoreName() {
234 return dataStoreName;
237 public LogicalDatastoreType getLogicalStoreType() {
238 return logicalStoreType;
241 public YangInstanceIdentifier getStoreRoot() {
245 public long getTransactionCreationInitialRateLimit() {
246 return transactionCreationInitialRateLimit;
249 public String getShardManagerPersistenceId() {
250 return shardManagerPersistenceId;
254 public String getTempFileDirectory() {
255 return raftConfig.getTempFileDirectory();
258 private void setTempFileDirectory(final String tempFileDirectory) {
259 raftConfig.setTempFileDirectory(tempFileDirectory);
263 public int getFileBackedStreamingThreshold() {
264 return raftConfig.getFileBackedStreamingThreshold();
267 private void setFileBackedStreamingThreshold(final int fileBackedStreamingThreshold) {
268 raftConfig.setFileBackedStreamingThreshold(fileBackedStreamingThreshold);
271 private void setPeerAddressResolver(final PeerAddressResolver resolver) {
272 raftConfig.setPeerAddressResolver(resolver);
275 private void setHeartbeatInterval(final long shardHeartbeatIntervalInMillis) {
276 raftConfig.setHeartBeatInterval(new FiniteDuration(shardHeartbeatIntervalInMillis,
277 TimeUnit.MILLISECONDS));
280 private void setShardJournalRecoveryLogBatchSize(final int shardJournalRecoveryLogBatchSize) {
281 raftConfig.setJournalRecoveryLogBatchSize(shardJournalRecoveryLogBatchSize);
285 private void setIsolatedLeaderCheckInterval(final long shardIsolatedLeaderCheckIntervalInMillis) {
286 raftConfig.setIsolatedLeaderCheckInterval(
287 new FiniteDuration(shardIsolatedLeaderCheckIntervalInMillis, TimeUnit.MILLISECONDS));
290 private void setElectionTimeoutFactor(final long shardElectionTimeoutFactor) {
291 raftConfig.setElectionTimeoutFactor(shardElectionTimeoutFactor);
294 private void setCandidateElectionTimeoutDivisor(final long candidateElectionTimeoutDivisor) {
295 raftConfig.setCandidateElectionTimeoutDivisor(candidateElectionTimeoutDivisor);
298 private void setCustomRaftPolicyImplementation(final String customRaftPolicyImplementation) {
299 raftConfig.setCustomRaftPolicyImplementationClass(customRaftPolicyImplementation);
302 private void setSnapshotDataThresholdPercentage(final int shardSnapshotDataThresholdPercentage) {
303 checkArgument(shardSnapshotDataThresholdPercentage >= 0 && shardSnapshotDataThresholdPercentage <= 100);
304 raftConfig.setSnapshotDataThresholdPercentage(shardSnapshotDataThresholdPercentage);
307 private void setSnapshotBatchCount(final long shardSnapshotBatchCount) {
308 raftConfig.setSnapshotBatchCount(shardSnapshotBatchCount);
312 * Set the interval in seconds after which a snapshot should be taken during the recovery process.
313 * 0 means don't take snapshots
315 private void setRecoverySnapshotIntervalSeconds(final int recoverySnapshotInterval) {
316 raftConfig.setRecoverySnapshotIntervalSeconds(recoverySnapshotInterval);
320 private void setShardSnapshotChunkSize(final int shardSnapshotChunkSize) {
321 // We'll honor the shardSnapshotChunkSize setting for backwards compatibility but only if it doesn't exceed
322 // maximumMessageSliceSize.
323 if (shardSnapshotChunkSize < maximumMessageSliceSize) {
324 raftConfig.setSnapshotChunkSize(shardSnapshotChunkSize);
328 private void setMaximumMessageSliceSize(final int maximumMessageSliceSize) {
329 raftConfig.setSnapshotChunkSize(maximumMessageSliceSize);
330 this.maximumMessageSliceSize = maximumMessageSliceSize;
333 private void setSyncIndexThreshold(final long syncIndexThreshold) {
334 raftConfig.setSyncIndexThreshold(syncIndexThreshold);
337 public int getShardBatchedModificationCount() {
338 return shardBatchedModificationCount;
341 public boolean isWriteOnlyTransactionOptimizationsEnabled() {
342 return writeOnlyTransactionOptimizationsEnabled;
345 public long getShardCommitQueueExpiryTimeoutInMillis() {
346 return shardCommitQueueExpiryTimeoutInMillis;
349 public boolean isTransactionDebugContextEnabled() {
350 return transactionDebugContextEnabled;
353 public boolean isUseTellBasedProtocol() {
354 return useTellBasedProtocol;
357 public boolean isUseLz4Compression() {
358 return useLz4Compression;
362 public int getMaximumMessageSliceSize() {
363 return maximumMessageSliceSize;
367 public long getBackendAlivenessTimerInterval() {
368 return backendAlivenessTimerInterval;
372 public long getRequestTimeout() {
373 return requestTimeout;
377 public long getNoProgressTimeout() {
378 return noProgressTimeout;
381 public int getInitialPayloadSerializedBufferCapacity() {
382 return initialPayloadSerializedBufferCapacity;
385 public static class Builder implements org.opendaylight.yangtools.concepts.Builder<DatastoreContext> {
386 private final DatastoreContext datastoreContext;
388 Builder(final DatastoreContext datastoreContext) {
389 this.datastoreContext = datastoreContext;
392 public Builder boundedMailboxCapacity(final int boundedMailboxCapacity) {
393 // TODO - this is defined in the yang DataStoreProperties but not currently used.
397 public Builder enableMetricCapture(final boolean enableMetricCapture) {
398 // TODO - this is defined in the yang DataStoreProperties but not currently used.
403 public Builder shardTransactionIdleTimeout(final long timeout, final TimeUnit unit) {
404 datastoreContext.shardTransactionIdleTimeout = FiniteDuration.create(timeout, unit);
408 public Builder shardTransactionIdleTimeoutInMinutes(final long timeout) {
409 return shardTransactionIdleTimeout(timeout, TimeUnit.MINUTES);
412 public Builder operationTimeoutInSeconds(final int operationTimeoutInSeconds) {
413 datastoreContext.operationTimeoutInMillis = TimeUnit.SECONDS.toMillis(operationTimeoutInSeconds);
417 public Builder operationTimeoutInMillis(final long operationTimeoutInMillis) {
418 datastoreContext.operationTimeoutInMillis = operationTimeoutInMillis;
422 public Builder dataStoreMXBeanType(final String dataStoreMXBeanType) {
423 datastoreContext.dataStoreMXBeanType = dataStoreMXBeanType;
427 public Builder shardTransactionCommitTimeoutInSeconds(final int shardTransactionCommitTimeoutInSeconds) {
428 datastoreContext.shardTransactionCommitTimeoutInSeconds = shardTransactionCommitTimeoutInSeconds;
432 public Builder shardJournalRecoveryLogBatchSize(final int shardJournalRecoveryLogBatchSize) {
433 datastoreContext.setShardJournalRecoveryLogBatchSize(shardJournalRecoveryLogBatchSize);
437 public Builder shardSnapshotBatchCount(final int shardSnapshotBatchCount) {
438 datastoreContext.setSnapshotBatchCount(shardSnapshotBatchCount);
442 public Builder recoverySnapshotIntervalSeconds(final int recoverySnapshotIntervalSeconds) {
443 checkArgument(recoverySnapshotIntervalSeconds >= 0);
444 datastoreContext.setRecoverySnapshotIntervalSeconds(recoverySnapshotIntervalSeconds);
448 public Builder shardSnapshotDataThresholdPercentage(final int shardSnapshotDataThresholdPercentage) {
449 datastoreContext.setSnapshotDataThresholdPercentage(shardSnapshotDataThresholdPercentage);
453 public Builder shardHeartbeatIntervalInMillis(final int shardHeartbeatIntervalInMillis) {
454 datastoreContext.setHeartbeatInterval(shardHeartbeatIntervalInMillis);
458 public Builder shardTransactionCommitQueueCapacity(final int shardTransactionCommitQueueCapacity) {
459 datastoreContext.shardTransactionCommitQueueCapacity = shardTransactionCommitQueueCapacity;
463 public Builder shardInitializationTimeout(final long timeout, final TimeUnit unit) {
464 datastoreContext.shardInitializationTimeout = new Timeout(timeout, unit);
468 public Builder shardInitializationTimeoutInSeconds(final long timeout) {
469 return shardInitializationTimeout(timeout, TimeUnit.SECONDS);
472 public Builder shardLeaderElectionTimeout(final long timeout, final TimeUnit unit) {
473 datastoreContext.shardLeaderElectionTimeout = new Timeout(timeout, unit);
477 public Builder initialSettleTimeoutMultiplier(final int multiplier) {
478 checkArgument(multiplier >= 0);
479 datastoreContext.initialSettleTimeoutMultiplier = multiplier;
483 public Builder shardLeaderElectionTimeoutInSeconds(final long timeout) {
484 return shardLeaderElectionTimeout(timeout, TimeUnit.SECONDS);
487 public Builder configurationReader(final AkkaConfigurationReader configurationReader) {
488 datastoreContext.configurationReader = configurationReader;
492 public Builder persistent(final boolean persistent) {
493 datastoreContext.persistent = persistent;
497 public Builder snapshotOnRootOverwrite(final boolean snapshotOnRootOverwrite) {
498 datastoreContext.snapshotOnRootOverwrite = snapshotOnRootOverwrite;
502 public Builder shardIsolatedLeaderCheckIntervalInMillis(final int shardIsolatedLeaderCheckIntervalInMillis) {
503 datastoreContext.setIsolatedLeaderCheckInterval(shardIsolatedLeaderCheckIntervalInMillis);
507 public Builder shardElectionTimeoutFactor(final long shardElectionTimeoutFactor) {
508 datastoreContext.setElectionTimeoutFactor(shardElectionTimeoutFactor);
512 public Builder shardCandidateElectionTimeoutDivisor(final long candidateElectionTimeoutDivisor) {
513 datastoreContext.setCandidateElectionTimeoutDivisor(candidateElectionTimeoutDivisor);
517 public Builder transactionCreationInitialRateLimit(final long initialRateLimit) {
518 datastoreContext.transactionCreationInitialRateLimit = initialRateLimit;
522 public Builder logicalStoreType(final LogicalDatastoreType logicalStoreType) {
523 datastoreContext.logicalStoreType = requireNonNull(logicalStoreType);
525 // Retain compatible naming
526 switch (logicalStoreType) {
528 dataStoreName("config");
531 dataStoreName("operational");
534 dataStoreName(logicalStoreType.name());
540 public Builder storeRoot(final YangInstanceIdentifier storeRoot) {
541 datastoreContext.storeRoot = storeRoot;
545 public Builder dataStoreName(final String dataStoreName) {
546 datastoreContext.dataStoreName = requireNonNull(dataStoreName);
547 datastoreContext.dataStoreMXBeanType = "Distributed" + WordUtils.capitalize(dataStoreName) + "Datastore";
551 public Builder shardBatchedModificationCount(final int shardBatchedModificationCount) {
552 datastoreContext.shardBatchedModificationCount = shardBatchedModificationCount;
556 public Builder writeOnlyTransactionOptimizationsEnabled(final boolean value) {
557 datastoreContext.writeOnlyTransactionOptimizationsEnabled = value;
561 public Builder shardCommitQueueExpiryTimeoutInMillis(final long value) {
562 datastoreContext.shardCommitQueueExpiryTimeoutInMillis = value;
566 public Builder shardCommitQueueExpiryTimeoutInSeconds(final long value) {
567 datastoreContext.shardCommitQueueExpiryTimeoutInMillis = TimeUnit.MILLISECONDS.convert(
568 value, TimeUnit.SECONDS);
572 public Builder transactionDebugContextEnabled(final boolean value) {
573 datastoreContext.transactionDebugContextEnabled = value;
577 @Deprecated(forRemoval = true)
578 public Builder maxShardDataChangeExecutorPoolSize(final int newMaxShardDataChangeExecutorPoolSize) {
582 @Deprecated(forRemoval = true)
583 public Builder maxShardDataChangeExecutorQueueSize(final int newMaxShardDataChangeExecutorQueueSize) {
587 @Deprecated(forRemoval = true)
588 public Builder maxShardDataChangeListenerQueueSize(final int newMaxShardDataChangeListenerQueueSize) {
592 @Deprecated(forRemoval = true)
593 public Builder maxShardDataStoreExecutorQueueSize(final int newMaxShardDataStoreExecutorQueueSize) {
597 public Builder useTellBasedProtocol(final boolean value) {
598 datastoreContext.useTellBasedProtocol = value;
602 public Builder useLz4Compression(final boolean value) {
603 datastoreContext.useLz4Compression = value;
608 * For unit tests only.
611 public Builder shardManagerPersistenceId(final String id) {
612 datastoreContext.shardManagerPersistenceId = id;
616 public Builder customRaftPolicyImplementation(final String customRaftPolicyImplementation) {
617 datastoreContext.setCustomRaftPolicyImplementation(customRaftPolicyImplementation);
622 public Builder shardSnapshotChunkSize(final int shardSnapshotChunkSize) {
623 LOG.warn("The shard-snapshot-chunk-size configuration parameter is deprecated - "
624 + "use maximum-message-slice-size instead");
625 datastoreContext.setShardSnapshotChunkSize(shardSnapshotChunkSize);
629 public Builder maximumMessageSliceSize(final int maximumMessageSliceSize) {
630 datastoreContext.setMaximumMessageSliceSize(maximumMessageSliceSize);
634 public Builder shardPeerAddressResolver(final PeerAddressResolver resolver) {
635 datastoreContext.setPeerAddressResolver(resolver);
639 public Builder tempFileDirectory(final String tempFileDirectory) {
640 datastoreContext.setTempFileDirectory(tempFileDirectory);
644 public Builder fileBackedStreamingThresholdInMegabytes(final int fileBackedStreamingThreshold) {
645 datastoreContext.setFileBackedStreamingThreshold(fileBackedStreamingThreshold * ConfigParams.MEGABYTE);
649 public Builder syncIndexThreshold(final long syncIndexThreshold) {
650 datastoreContext.setSyncIndexThreshold(syncIndexThreshold);
654 public Builder backendAlivenessTimerIntervalInSeconds(final long interval) {
655 datastoreContext.backendAlivenessTimerInterval = TimeUnit.SECONDS.toNanos(interval);
659 public Builder frontendRequestTimeoutInSeconds(final long timeout) {
660 datastoreContext.requestTimeout = TimeUnit.SECONDS.toNanos(timeout);
664 public Builder frontendNoProgressTimeoutInSeconds(final long timeout) {
665 datastoreContext.noProgressTimeout = TimeUnit.SECONDS.toNanos(timeout);
669 public Builder initialPayloadSerializedBufferCapacity(final int capacity) {
670 datastoreContext.initialPayloadSerializedBufferCapacity = capacity;
675 public DatastoreContext build() {
676 if (datastoreContext.dataStoreName != null) {
677 GLOBAL_DATASTORE_NAMES.add(datastoreContext.dataStoreName);
680 return datastoreContext;