Remove use of InMemoryDOMDataStoreConfigProperties
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / DatastoreContext.java
1 /*
2  * Copyright (c) 2014 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.cluster.datastore;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
12
13 import akka.util.Timeout;
14 import com.google.common.annotations.VisibleForTesting;
15 import java.util.Set;
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;
31
32 /**
33  * Contains contextual data for a data store.
34  *
35  * @author Thomas Pantelis
36  */
37 // Non-final for mocking
38 public class DatastoreContext implements ClientActorConfig {
39     public static final String METRICS_DOMAIN = "org.opendaylight.controller.cluster.datastore";
40
41     public static final FiniteDuration DEFAULT_SHARD_TRANSACTION_IDLE_TIMEOUT = FiniteDuration.create(10,
42         TimeUnit.MINUTES);
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_HEARTBEAT_INTERVAL_IN_MILLIS = 500;
48     public static final int DEFAULT_ISOLATED_LEADER_CHECK_INTERVAL_IN_MILLIS =
49             DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS * 10;
50     public static final int DEFAULT_SHARD_TX_COMMIT_QUEUE_CAPACITY = 50000;
51     public static final Timeout DEFAULT_SHARD_INITIALIZATION_TIMEOUT = new Timeout(5, TimeUnit.MINUTES);
52     public static final Timeout DEFAULT_SHARD_LEADER_ELECTION_TIMEOUT = new Timeout(30, TimeUnit.SECONDS);
53     public static final int DEFAULT_INITIAL_SETTLE_TIMEOUT_MULTIPLIER = 3;
54     public static final boolean DEFAULT_PERSISTENT = true;
55     public static final FileAkkaConfigurationReader DEFAULT_CONFIGURATION_READER = new FileAkkaConfigurationReader();
56     public static final int DEFAULT_SHARD_SNAPSHOT_DATA_THRESHOLD_PERCENTAGE = 12;
57     public static final int DEFAULT_SHARD_ELECTION_TIMEOUT_FACTOR = 2;
58     public static final int DEFAULT_SHARD_CANDIDATE_ELECTION_TIMEOUT_DIVISOR = 1;
59     public static final int DEFAULT_TX_CREATION_INITIAL_RATE_LIMIT = 100;
60     public static final String UNKNOWN_DATA_STORE_TYPE = "unknown";
61     public static final int DEFAULT_SHARD_BATCHED_MODIFICATION_COUNT = 1000;
62     public static final long DEFAULT_SHARD_COMMIT_QUEUE_EXPIRY_TIMEOUT_IN_MS =
63             TimeUnit.MILLISECONDS.convert(2, TimeUnit.MINUTES);
64     public static final int DEFAULT_MAX_MESSAGE_SLICE_SIZE = 2048 * 1000; // 2MB
65     public static final int DEFAULT_INITIAL_PAYLOAD_SERIALIZED_BUFFER_CAPACITY = 512;
66
67     public static final long DEFAULT_SYNC_INDEX_THRESHOLD = 10;
68
69     private static final Logger LOG = LoggerFactory.getLogger(DatastoreContext.class);
70
71     private static final Set<String> GLOBAL_DATASTORE_NAMES = ConcurrentHashMap.newKeySet();
72
73     private final DefaultConfigParamsImpl raftConfig = new DefaultConfigParamsImpl();
74
75     private FiniteDuration shardTransactionIdleTimeout = DatastoreContext.DEFAULT_SHARD_TRANSACTION_IDLE_TIMEOUT;
76     private long operationTimeoutInMillis = DEFAULT_OPERATION_TIMEOUT_IN_MS;
77     private String dataStoreMXBeanType;
78     private int shardTransactionCommitTimeoutInSeconds = DEFAULT_SHARD_TX_COMMIT_TIMEOUT_IN_SECONDS;
79     private int shardTransactionCommitQueueCapacity = DEFAULT_SHARD_TX_COMMIT_QUEUE_CAPACITY;
80     private Timeout shardInitializationTimeout = DEFAULT_SHARD_INITIALIZATION_TIMEOUT;
81     private Timeout shardLeaderElectionTimeout = DEFAULT_SHARD_LEADER_ELECTION_TIMEOUT;
82     private int initialSettleTimeoutMultiplier = DEFAULT_INITIAL_SETTLE_TIMEOUT_MULTIPLIER;
83     private boolean persistent = DEFAULT_PERSISTENT;
84     private AkkaConfigurationReader configurationReader = DEFAULT_CONFIGURATION_READER;
85     private long transactionCreationInitialRateLimit = DEFAULT_TX_CREATION_INITIAL_RATE_LIMIT;
86     private String dataStoreName = UNKNOWN_DATA_STORE_TYPE;
87     private LogicalDatastoreType logicalStoreType = LogicalDatastoreType.OPERATIONAL;
88     private YangInstanceIdentifier storeRoot = YangInstanceIdentifier.empty();
89     private int shardBatchedModificationCount = DEFAULT_SHARD_BATCHED_MODIFICATION_COUNT;
90     private boolean writeOnlyTransactionOptimizationsEnabled = true;
91     private long shardCommitQueueExpiryTimeoutInMillis = DEFAULT_SHARD_COMMIT_QUEUE_EXPIRY_TIMEOUT_IN_MS;
92     private boolean useTellBasedProtocol = false;
93     private boolean transactionDebugContextEnabled = false;
94     private String shardManagerPersistenceId;
95     private int maximumMessageSliceSize = DEFAULT_MAX_MESSAGE_SLICE_SIZE;
96     private long backendAlivenessTimerInterval = AbstractClientConnection.DEFAULT_BACKEND_ALIVE_TIMEOUT_NANOS;
97     private long requestTimeout = AbstractClientConnection.DEFAULT_REQUEST_TIMEOUT_NANOS;
98     private long noProgressTimeout = AbstractClientConnection.DEFAULT_NO_PROGRESS_TIMEOUT_NANOS;
99     private int initialPayloadSerializedBufferCapacity = DEFAULT_INITIAL_PAYLOAD_SERIALIZED_BUFFER_CAPACITY;
100
101     public static Set<String> getGlobalDatastoreNames() {
102         return GLOBAL_DATASTORE_NAMES;
103     }
104
105     DatastoreContext() {
106         setShardJournalRecoveryLogBatchSize(DEFAULT_JOURNAL_RECOVERY_BATCH_SIZE);
107         setSnapshotBatchCount(DEFAULT_SNAPSHOT_BATCH_COUNT);
108         setHeartbeatInterval(DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS);
109         setIsolatedLeaderCheckInterval(DEFAULT_ISOLATED_LEADER_CHECK_INTERVAL_IN_MILLIS);
110         setSnapshotDataThresholdPercentage(DEFAULT_SHARD_SNAPSHOT_DATA_THRESHOLD_PERCENTAGE);
111         setElectionTimeoutFactor(DEFAULT_SHARD_ELECTION_TIMEOUT_FACTOR);
112         setCandidateElectionTimeoutDivisor(DEFAULT_SHARD_CANDIDATE_ELECTION_TIMEOUT_DIVISOR);
113         setSyncIndexThreshold(DEFAULT_SYNC_INDEX_THRESHOLD);
114         setMaximumMessageSliceSize(DEFAULT_MAX_MESSAGE_SLICE_SIZE);
115     }
116
117     private DatastoreContext(final DatastoreContext other) {
118         this.shardTransactionIdleTimeout = other.shardTransactionIdleTimeout;
119         this.operationTimeoutInMillis = other.operationTimeoutInMillis;
120         this.dataStoreMXBeanType = other.dataStoreMXBeanType;
121         this.shardTransactionCommitTimeoutInSeconds = other.shardTransactionCommitTimeoutInSeconds;
122         this.shardTransactionCommitQueueCapacity = other.shardTransactionCommitQueueCapacity;
123         this.shardInitializationTimeout = other.shardInitializationTimeout;
124         this.shardLeaderElectionTimeout = other.shardLeaderElectionTimeout;
125         this.initialSettleTimeoutMultiplier = other.initialSettleTimeoutMultiplier;
126         this.persistent = other.persistent;
127         this.configurationReader = other.configurationReader;
128         this.transactionCreationInitialRateLimit = other.transactionCreationInitialRateLimit;
129         this.dataStoreName = other.dataStoreName;
130         this.logicalStoreType = other.logicalStoreType;
131         this.storeRoot = other.storeRoot;
132         this.shardBatchedModificationCount = other.shardBatchedModificationCount;
133         this.writeOnlyTransactionOptimizationsEnabled = other.writeOnlyTransactionOptimizationsEnabled;
134         this.shardCommitQueueExpiryTimeoutInMillis = other.shardCommitQueueExpiryTimeoutInMillis;
135         this.transactionDebugContextEnabled = other.transactionDebugContextEnabled;
136         this.shardManagerPersistenceId = other.shardManagerPersistenceId;
137         this.useTellBasedProtocol = other.useTellBasedProtocol;
138         this.backendAlivenessTimerInterval = other.backendAlivenessTimerInterval;
139         this.requestTimeout = other.requestTimeout;
140         this.noProgressTimeout = other.noProgressTimeout;
141         this.initialPayloadSerializedBufferCapacity = other.initialPayloadSerializedBufferCapacity;
142
143         setShardJournalRecoveryLogBatchSize(other.raftConfig.getJournalRecoveryLogBatchSize());
144         setSnapshotBatchCount(other.raftConfig.getSnapshotBatchCount());
145         setHeartbeatInterval(other.raftConfig.getHeartBeatInterval().toMillis());
146         setIsolatedLeaderCheckInterval(other.raftConfig.getIsolatedCheckIntervalInMillis());
147         setSnapshotDataThresholdPercentage(other.raftConfig.getSnapshotDataThresholdPercentage());
148         setElectionTimeoutFactor(other.raftConfig.getElectionTimeoutFactor());
149         setCandidateElectionTimeoutDivisor(other.raftConfig.getCandidateElectionTimeoutDivisor());
150         setCustomRaftPolicyImplementation(other.raftConfig.getCustomRaftPolicyImplementationClass());
151         setMaximumMessageSliceSize(other.getMaximumMessageSliceSize());
152         setShardSnapshotChunkSize(other.raftConfig.getSnapshotChunkSize());
153         setPeerAddressResolver(other.raftConfig.getPeerAddressResolver());
154         setTempFileDirectory(other.getTempFileDirectory());
155         setFileBackedStreamingThreshold(other.getFileBackedStreamingThreshold());
156         setSyncIndexThreshold(other.raftConfig.getSyncIndexThreshold());
157     }
158
159     public static Builder newBuilder() {
160         return new Builder(new DatastoreContext());
161     }
162
163     public static Builder newBuilderFrom(final DatastoreContext context) {
164         return new Builder(new DatastoreContext(context));
165     }
166
167     public FiniteDuration getShardTransactionIdleTimeout() {
168         return shardTransactionIdleTimeout;
169     }
170
171     public String getDataStoreMXBeanType() {
172         return dataStoreMXBeanType;
173     }
174
175     public long getOperationTimeoutInMillis() {
176         return operationTimeoutInMillis;
177     }
178
179     public ConfigParams getShardRaftConfig() {
180         return raftConfig;
181     }
182
183     public int getShardTransactionCommitTimeoutInSeconds() {
184         return shardTransactionCommitTimeoutInSeconds;
185     }
186
187     public int getShardTransactionCommitQueueCapacity() {
188         return shardTransactionCommitQueueCapacity;
189     }
190
191     public Timeout getShardInitializationTimeout() {
192         return shardInitializationTimeout;
193     }
194
195     public Timeout getShardLeaderElectionTimeout() {
196         return shardLeaderElectionTimeout;
197     }
198
199     /**
200      * Return the multiplier of {@link #getShardLeaderElectionTimeout()} which the frontend will wait for all shards
201      * on the local node to settle.
202      *
203      * @return Non-negative multiplier. Value of {@code 0} indicates to wait indefinitely.
204      */
205     public int getInitialSettleTimeoutMultiplier() {
206         return initialSettleTimeoutMultiplier;
207     }
208
209     public boolean isPersistent() {
210         return persistent;
211     }
212
213     public AkkaConfigurationReader getConfigurationReader() {
214         return configurationReader;
215     }
216
217     public long getShardElectionTimeoutFactor() {
218         return raftConfig.getElectionTimeoutFactor();
219     }
220
221     public String getDataStoreName() {
222         return dataStoreName;
223     }
224
225     public LogicalDatastoreType getLogicalStoreType() {
226         return logicalStoreType;
227     }
228
229     public YangInstanceIdentifier getStoreRoot() {
230         return storeRoot;
231     }
232
233     public long getTransactionCreationInitialRateLimit() {
234         return transactionCreationInitialRateLimit;
235     }
236
237     public String getShardManagerPersistenceId() {
238         return shardManagerPersistenceId;
239     }
240
241     @Override
242     public String getTempFileDirectory() {
243         return raftConfig.getTempFileDirectory();
244     }
245
246     private void setTempFileDirectory(final String tempFileDirectory) {
247         raftConfig.setTempFileDirectory(tempFileDirectory);
248     }
249
250     @Override
251     public int getFileBackedStreamingThreshold() {
252         return raftConfig.getFileBackedStreamingThreshold();
253     }
254
255     private void setFileBackedStreamingThreshold(final int fileBackedStreamingThreshold) {
256         raftConfig.setFileBackedStreamingThreshold(fileBackedStreamingThreshold);
257     }
258
259     private void setPeerAddressResolver(final PeerAddressResolver resolver) {
260         raftConfig.setPeerAddressResolver(resolver);
261     }
262
263     private void setHeartbeatInterval(final long shardHeartbeatIntervalInMillis) {
264         raftConfig.setHeartBeatInterval(new FiniteDuration(shardHeartbeatIntervalInMillis,
265                 TimeUnit.MILLISECONDS));
266     }
267
268     private void setShardJournalRecoveryLogBatchSize(final int shardJournalRecoveryLogBatchSize) {
269         raftConfig.setJournalRecoveryLogBatchSize(shardJournalRecoveryLogBatchSize);
270     }
271
272
273     private void setIsolatedLeaderCheckInterval(final long shardIsolatedLeaderCheckIntervalInMillis) {
274         raftConfig.setIsolatedLeaderCheckInterval(
275                 new FiniteDuration(shardIsolatedLeaderCheckIntervalInMillis, TimeUnit.MILLISECONDS));
276     }
277
278     private void setElectionTimeoutFactor(final long shardElectionTimeoutFactor) {
279         raftConfig.setElectionTimeoutFactor(shardElectionTimeoutFactor);
280     }
281
282     private void setCandidateElectionTimeoutDivisor(final long candidateElectionTimeoutDivisor) {
283         raftConfig.setCandidateElectionTimeoutDivisor(candidateElectionTimeoutDivisor);
284     }
285
286     private void setCustomRaftPolicyImplementation(final String customRaftPolicyImplementation) {
287         raftConfig.setCustomRaftPolicyImplementationClass(customRaftPolicyImplementation);
288     }
289
290     private void setSnapshotDataThresholdPercentage(final int shardSnapshotDataThresholdPercentage) {
291         checkArgument(shardSnapshotDataThresholdPercentage >= 0 && shardSnapshotDataThresholdPercentage <= 100);
292         raftConfig.setSnapshotDataThresholdPercentage(shardSnapshotDataThresholdPercentage);
293     }
294
295     private void setSnapshotBatchCount(final long shardSnapshotBatchCount) {
296         raftConfig.setSnapshotBatchCount(shardSnapshotBatchCount);
297     }
298
299     @Deprecated
300     private void setShardSnapshotChunkSize(final int shardSnapshotChunkSize) {
301         // We'll honor the shardSnapshotChunkSize setting for backwards compatibility but only if it doesn't exceed
302         // maximumMessageSliceSize.
303         if (shardSnapshotChunkSize < maximumMessageSliceSize) {
304             raftConfig.setSnapshotChunkSize(shardSnapshotChunkSize);
305         }
306     }
307
308     private void setMaximumMessageSliceSize(final int maximumMessageSliceSize) {
309         raftConfig.setSnapshotChunkSize(maximumMessageSliceSize);
310         this.maximumMessageSliceSize = maximumMessageSliceSize;
311     }
312
313     private void setSyncIndexThreshold(final long syncIndexThreshold) {
314         raftConfig.setSyncIndexThreshold(syncIndexThreshold);
315     }
316
317     public int getShardBatchedModificationCount() {
318         return shardBatchedModificationCount;
319     }
320
321     public boolean isWriteOnlyTransactionOptimizationsEnabled() {
322         return writeOnlyTransactionOptimizationsEnabled;
323     }
324
325     public long getShardCommitQueueExpiryTimeoutInMillis() {
326         return shardCommitQueueExpiryTimeoutInMillis;
327     }
328
329     public boolean isTransactionDebugContextEnabled() {
330         return transactionDebugContextEnabled;
331     }
332
333     public boolean isUseTellBasedProtocol() {
334         return useTellBasedProtocol;
335     }
336
337     @Override
338     public int getMaximumMessageSliceSize() {
339         return maximumMessageSliceSize;
340     }
341
342     @Override
343     public long getBackendAlivenessTimerInterval() {
344         return backendAlivenessTimerInterval;
345     }
346
347     @Override
348     public long getRequestTimeout() {
349         return requestTimeout;
350     }
351
352     @Override
353     public long getNoProgressTimeout() {
354         return noProgressTimeout;
355     }
356
357     public int getInitialPayloadSerializedBufferCapacity() {
358         return initialPayloadSerializedBufferCapacity;
359     }
360
361     public static class Builder implements org.opendaylight.yangtools.concepts.Builder<DatastoreContext> {
362         private final DatastoreContext datastoreContext;
363
364         Builder(final DatastoreContext datastoreContext) {
365             this.datastoreContext = datastoreContext;
366         }
367
368         public Builder boundedMailboxCapacity(final int boundedMailboxCapacity) {
369             // TODO - this is defined in the yang DataStoreProperties but not currently used.
370             return this;
371         }
372
373         public Builder enableMetricCapture(final boolean enableMetricCapture) {
374             // TODO - this is defined in the yang DataStoreProperties but not currently used.
375             return this;
376         }
377
378
379         public Builder shardTransactionIdleTimeout(final long timeout, final TimeUnit unit) {
380             datastoreContext.shardTransactionIdleTimeout = FiniteDuration.create(timeout, unit);
381             return this;
382         }
383
384         public Builder shardTransactionIdleTimeoutInMinutes(final long timeout) {
385             return shardTransactionIdleTimeout(timeout, TimeUnit.MINUTES);
386         }
387
388         public Builder operationTimeoutInSeconds(final int operationTimeoutInSeconds) {
389             datastoreContext.operationTimeoutInMillis = TimeUnit.SECONDS.toMillis(operationTimeoutInSeconds);
390             return this;
391         }
392
393         public Builder operationTimeoutInMillis(final long operationTimeoutInMillis) {
394             datastoreContext.operationTimeoutInMillis = operationTimeoutInMillis;
395             return this;
396         }
397
398         public Builder dataStoreMXBeanType(final String dataStoreMXBeanType) {
399             datastoreContext.dataStoreMXBeanType = dataStoreMXBeanType;
400             return this;
401         }
402
403         public Builder shardTransactionCommitTimeoutInSeconds(final int shardTransactionCommitTimeoutInSeconds) {
404             datastoreContext.shardTransactionCommitTimeoutInSeconds = shardTransactionCommitTimeoutInSeconds;
405             return this;
406         }
407
408         public Builder shardJournalRecoveryLogBatchSize(final int shardJournalRecoveryLogBatchSize) {
409             datastoreContext.setShardJournalRecoveryLogBatchSize(shardJournalRecoveryLogBatchSize);
410             return this;
411         }
412
413         public Builder shardSnapshotBatchCount(final int shardSnapshotBatchCount) {
414             datastoreContext.setSnapshotBatchCount(shardSnapshotBatchCount);
415             return this;
416         }
417
418         public Builder shardSnapshotDataThresholdPercentage(final int shardSnapshotDataThresholdPercentage) {
419             datastoreContext.setSnapshotDataThresholdPercentage(shardSnapshotDataThresholdPercentage);
420             return this;
421         }
422
423         public Builder shardHeartbeatIntervalInMillis(final int shardHeartbeatIntervalInMillis) {
424             datastoreContext.setHeartbeatInterval(shardHeartbeatIntervalInMillis);
425             return this;
426         }
427
428         public Builder shardTransactionCommitQueueCapacity(final int shardTransactionCommitQueueCapacity) {
429             datastoreContext.shardTransactionCommitQueueCapacity = shardTransactionCommitQueueCapacity;
430             return this;
431         }
432
433         public Builder shardInitializationTimeout(final long timeout, final TimeUnit unit) {
434             datastoreContext.shardInitializationTimeout = new Timeout(timeout, unit);
435             return this;
436         }
437
438         public Builder shardInitializationTimeoutInSeconds(final long timeout) {
439             return shardInitializationTimeout(timeout, TimeUnit.SECONDS);
440         }
441
442         public Builder shardLeaderElectionTimeout(final long timeout, final TimeUnit unit) {
443             datastoreContext.shardLeaderElectionTimeout = new Timeout(timeout, unit);
444             return this;
445         }
446
447         public Builder initialSettleTimeoutMultiplier(final int multiplier) {
448             checkArgument(multiplier >= 0);
449             datastoreContext.initialSettleTimeoutMultiplier = multiplier;
450             return this;
451         }
452
453         public Builder shardLeaderElectionTimeoutInSeconds(final long timeout) {
454             return shardLeaderElectionTimeout(timeout, TimeUnit.SECONDS);
455         }
456
457         public Builder configurationReader(final AkkaConfigurationReader configurationReader) {
458             datastoreContext.configurationReader = configurationReader;
459             return this;
460         }
461
462         public Builder persistent(final boolean persistent) {
463             datastoreContext.persistent = persistent;
464             return this;
465         }
466
467         public Builder shardIsolatedLeaderCheckIntervalInMillis(final int shardIsolatedLeaderCheckIntervalInMillis) {
468             datastoreContext.setIsolatedLeaderCheckInterval(shardIsolatedLeaderCheckIntervalInMillis);
469             return this;
470         }
471
472         public Builder shardElectionTimeoutFactor(final long shardElectionTimeoutFactor) {
473             datastoreContext.setElectionTimeoutFactor(shardElectionTimeoutFactor);
474             return this;
475         }
476
477         public Builder shardCandidateElectionTimeoutDivisor(final long candidateElectionTimeoutDivisor) {
478             datastoreContext.setCandidateElectionTimeoutDivisor(candidateElectionTimeoutDivisor);
479             return this;
480         }
481
482         public Builder transactionCreationInitialRateLimit(final long initialRateLimit) {
483             datastoreContext.transactionCreationInitialRateLimit = initialRateLimit;
484             return this;
485         }
486
487         public Builder logicalStoreType(final LogicalDatastoreType logicalStoreType) {
488             datastoreContext.logicalStoreType = requireNonNull(logicalStoreType);
489
490             // Retain compatible naming
491             switch (logicalStoreType) {
492                 case CONFIGURATION:
493                     dataStoreName("config");
494                     break;
495                 case OPERATIONAL:
496                     dataStoreName("operational");
497                     break;
498                 default:
499                     dataStoreName(logicalStoreType.name());
500             }
501
502             return this;
503         }
504
505         public Builder storeRoot(final YangInstanceIdentifier storeRoot) {
506             datastoreContext.storeRoot = storeRoot;
507             return this;
508         }
509
510         public Builder dataStoreName(final String dataStoreName) {
511             datastoreContext.dataStoreName = requireNonNull(dataStoreName);
512             datastoreContext.dataStoreMXBeanType = "Distributed" + WordUtils.capitalize(dataStoreName) + "Datastore";
513             return this;
514         }
515
516         public Builder shardBatchedModificationCount(final int shardBatchedModificationCount) {
517             datastoreContext.shardBatchedModificationCount = shardBatchedModificationCount;
518             return this;
519         }
520
521         public Builder writeOnlyTransactionOptimizationsEnabled(final boolean value) {
522             datastoreContext.writeOnlyTransactionOptimizationsEnabled = value;
523             return this;
524         }
525
526         public Builder shardCommitQueueExpiryTimeoutInMillis(final long value) {
527             datastoreContext.shardCommitQueueExpiryTimeoutInMillis = value;
528             return this;
529         }
530
531         public Builder shardCommitQueueExpiryTimeoutInSeconds(final long value) {
532             datastoreContext.shardCommitQueueExpiryTimeoutInMillis = TimeUnit.MILLISECONDS.convert(
533                     value, TimeUnit.SECONDS);
534             return this;
535         }
536
537         public Builder transactionDebugContextEnabled(final boolean value) {
538             datastoreContext.transactionDebugContextEnabled = value;
539             return this;
540         }
541
542         @Deprecated(forRemoval = true)
543         public Builder maxShardDataChangeExecutorPoolSize(final int newMaxShardDataChangeExecutorPoolSize) {
544             return this;
545         }
546
547         @Deprecated(forRemoval = true)
548         public Builder maxShardDataChangeExecutorQueueSize(final int newMaxShardDataChangeExecutorQueueSize) {
549             return this;
550         }
551
552         @Deprecated(forRemoval = true)
553         public Builder maxShardDataChangeListenerQueueSize(final int newMaxShardDataChangeListenerQueueSize) {
554             return this;
555         }
556
557         @Deprecated(forRemoval = true)
558         public Builder maxShardDataStoreExecutorQueueSize(final int newMaxShardDataStoreExecutorQueueSize) {
559             return this;
560         }
561
562         public Builder useTellBasedProtocol(final boolean value) {
563             datastoreContext.useTellBasedProtocol = value;
564             return this;
565         }
566
567         /**
568          * For unit tests only.
569          */
570         @VisibleForTesting
571         public Builder shardManagerPersistenceId(final String id) {
572             datastoreContext.shardManagerPersistenceId = id;
573             return this;
574         }
575
576         public Builder customRaftPolicyImplementation(final String customRaftPolicyImplementation) {
577             datastoreContext.setCustomRaftPolicyImplementation(customRaftPolicyImplementation);
578             return this;
579         }
580
581         @Deprecated
582         public Builder shardSnapshotChunkSize(final int shardSnapshotChunkSize) {
583             LOG.warn("The shard-snapshot-chunk-size configuration parameter is deprecated - "
584                     + "use maximum-message-slice-size instead");
585             datastoreContext.setShardSnapshotChunkSize(shardSnapshotChunkSize);
586             return this;
587         }
588
589         public Builder maximumMessageSliceSize(final int maximumMessageSliceSize) {
590             datastoreContext.setMaximumMessageSliceSize(maximumMessageSliceSize);
591             return this;
592         }
593
594         public Builder shardPeerAddressResolver(final PeerAddressResolver resolver) {
595             datastoreContext.setPeerAddressResolver(resolver);
596             return this;
597         }
598
599         public Builder tempFileDirectory(final String tempFileDirectory) {
600             datastoreContext.setTempFileDirectory(tempFileDirectory);
601             return this;
602         }
603
604         public Builder fileBackedStreamingThresholdInMegabytes(final int fileBackedStreamingThreshold) {
605             datastoreContext.setFileBackedStreamingThreshold(fileBackedStreamingThreshold * ConfigParams.MEGABYTE);
606             return this;
607         }
608
609         public Builder syncIndexThreshold(final long syncIndexThreshold) {
610             datastoreContext.setSyncIndexThreshold(syncIndexThreshold);
611             return this;
612         }
613
614         public Builder backendAlivenessTimerIntervalInSeconds(final long interval) {
615             datastoreContext.backendAlivenessTimerInterval = TimeUnit.SECONDS.toNanos(interval);
616             return this;
617         }
618
619         public Builder frontendRequestTimeoutInSeconds(final long timeout) {
620             datastoreContext.requestTimeout = TimeUnit.SECONDS.toNanos(timeout);
621             return this;
622         }
623
624         public Builder frontendNoProgressTimeoutInSeconds(final long timeout) {
625             datastoreContext.noProgressTimeout = TimeUnit.SECONDS.toNanos(timeout);
626             return this;
627         }
628
629         public Builder initialPayloadSerializedBufferCapacity(final int capacity) {
630             datastoreContext.initialPayloadSerializedBufferCapacity = capacity;
631             return this;
632         }
633
634         @Override
635         public DatastoreContext build() {
636             if (datastoreContext.dataStoreName != null) {
637                 GLOBAL_DATASTORE_NAMES.add(datastoreContext.dataStoreName);
638             }
639
640             return datastoreContext;
641         }
642     }
643 }