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