Merge "(Bug 2035) - Increasing default Akka config for auto-down of unreachable nodes...
[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 java.util.concurrent.TimeUnit;
13 import org.apache.commons.lang3.text.WordUtils;
14 import org.opendaylight.controller.cluster.datastore.config.ConfigurationReader;
15 import org.opendaylight.controller.cluster.datastore.config.FileConfigurationReader;
16 import org.opendaylight.controller.cluster.raft.ConfigParams;
17 import org.opendaylight.controller.cluster.raft.DefaultConfigParamsImpl;
18 import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStoreConfigProperties;
19 import scala.concurrent.duration.Duration;
20 import scala.concurrent.duration.FiniteDuration;
21
22 /**
23  * Contains contextual data for a data store.
24  *
25  * @author Thomas Pantelis
26  */
27 public class DatastoreContext {
28
29     public static final Duration DEFAULT_SHARD_TRANSACTION_IDLE_TIMEOUT = Duration.create(10, TimeUnit.MINUTES);
30     public static final int DEFAULT_OPERATION_TIMEOUT_IN_SECONDS = 5;
31     public static final int DEFAULT_SHARD_TX_COMMIT_TIMEOUT_IN_SECONDS = 30;
32     public static final int DEFAULT_JOURNAL_RECOVERY_BATCH_SIZE = 1000;
33     public static final int DEFAULT_SNAPSHOT_BATCH_COUNT = 20000;
34     public static final int DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS = 500;
35     public static final int DEFAULT_ISOLATED_LEADER_CHECK_INTERVAL_IN_MILLIS = DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS * 10;
36     public static final int DEFAULT_SHARD_TX_COMMIT_QUEUE_CAPACITY = 20000;
37     public static final Timeout DEFAULT_SHARD_INITIALIZATION_TIMEOUT = new Timeout(5, TimeUnit.MINUTES);
38     public static final Timeout DEFAULT_SHARD_LEADER_ELECTION_TIMEOUT = new Timeout(30, TimeUnit.SECONDS);
39     public static final boolean DEFAULT_PERSISTENT = true;
40     public static final FileConfigurationReader DEFAULT_CONFIGURATION_READER = new FileConfigurationReader();
41     public static final int DEFAULT_SHARD_SNAPSHOT_DATA_THRESHOLD_PERCENTAGE = 12;
42     public static final int DEFAULT_SHARD_ELECTION_TIMEOUT_FACTOR = 2;
43     public static final int DEFAULT_TX_CREATION_INITIAL_RATE_LIMIT = 100;
44     public static final String UNKNOWN_DATA_STORE_TYPE = "unknown";
45
46     private InMemoryDOMDataStoreConfigProperties dataStoreProperties;
47     private Duration shardTransactionIdleTimeout = DatastoreContext.DEFAULT_SHARD_TRANSACTION_IDLE_TIMEOUT;
48     private int operationTimeoutInSeconds = DEFAULT_OPERATION_TIMEOUT_IN_SECONDS;
49     private String dataStoreMXBeanType;
50     private int shardTransactionCommitTimeoutInSeconds = DEFAULT_SHARD_TX_COMMIT_TIMEOUT_IN_SECONDS;
51     private int shardTransactionCommitQueueCapacity = DEFAULT_SHARD_TX_COMMIT_QUEUE_CAPACITY;
52     private Timeout shardInitializationTimeout = DEFAULT_SHARD_INITIALIZATION_TIMEOUT;
53     private Timeout shardLeaderElectionTimeout = DEFAULT_SHARD_LEADER_ELECTION_TIMEOUT;
54     private boolean persistent = DEFAULT_PERSISTENT;
55     private ConfigurationReader configurationReader = DEFAULT_CONFIGURATION_READER;
56     private long transactionCreationInitialRateLimit = DEFAULT_TX_CREATION_INITIAL_RATE_LIMIT;
57     private DefaultConfigParamsImpl raftConfig = new DefaultConfigParamsImpl();
58     private String dataStoreType = UNKNOWN_DATA_STORE_TYPE;
59
60     private DatastoreContext(){
61         setShardJournalRecoveryLogBatchSize(DEFAULT_JOURNAL_RECOVERY_BATCH_SIZE);
62         setSnapshotBatchCount(DEFAULT_SNAPSHOT_BATCH_COUNT);
63         setHeartbeatInterval(DEFAULT_HEARTBEAT_INTERVAL_IN_MILLIS);
64         setIsolatedLeaderCheckInterval(DEFAULT_ISOLATED_LEADER_CHECK_INTERVAL_IN_MILLIS);
65         setSnapshotDataThresholdPercentage(DEFAULT_SHARD_SNAPSHOT_DATA_THRESHOLD_PERCENTAGE);
66     }
67
68     public static Builder newBuilder() {
69         return new Builder();
70     }
71
72     public InMemoryDOMDataStoreConfigProperties getDataStoreProperties() {
73         return dataStoreProperties;
74     }
75
76     public Duration getShardTransactionIdleTimeout() {
77         return shardTransactionIdleTimeout;
78     }
79
80     public String getDataStoreMXBeanType() {
81         return dataStoreMXBeanType;
82     }
83
84     public int getOperationTimeoutInSeconds() {
85         return operationTimeoutInSeconds;
86     }
87
88     public ConfigParams getShardRaftConfig() {
89         return raftConfig;
90     }
91
92     public int getShardTransactionCommitTimeoutInSeconds() {
93         return shardTransactionCommitTimeoutInSeconds;
94     }
95
96     public int getShardTransactionCommitQueueCapacity() {
97         return shardTransactionCommitQueueCapacity;
98     }
99
100     public Timeout getShardInitializationTimeout() {
101         return shardInitializationTimeout;
102     }
103
104     public Timeout getShardLeaderElectionTimeout() {
105         return shardLeaderElectionTimeout;
106     }
107
108     public boolean isPersistent() {
109         return persistent;
110     }
111
112     public ConfigurationReader getConfigurationReader() {
113         return configurationReader;
114     }
115
116     public long getShardElectionTimeoutFactor(){
117         return raftConfig.getElectionTimeoutFactor();
118     }
119
120     public String getDataStoreType(){
121         return dataStoreType;
122     }
123
124     public long getTransactionCreationInitialRateLimit() {
125         return transactionCreationInitialRateLimit;
126     }
127
128     private void setHeartbeatInterval(long shardHeartbeatIntervalInMillis){
129         raftConfig.setHeartBeatInterval(new FiniteDuration(shardHeartbeatIntervalInMillis,
130                 TimeUnit.MILLISECONDS));
131     }
132
133     private void setShardJournalRecoveryLogBatchSize(int shardJournalRecoveryLogBatchSize){
134         raftConfig.setJournalRecoveryLogBatchSize(shardJournalRecoveryLogBatchSize);
135     }
136
137
138     private void setIsolatedLeaderCheckInterval(long shardIsolatedLeaderCheckIntervalInMillis) {
139         raftConfig.setIsolatedLeaderCheckInterval(
140                 new FiniteDuration(shardIsolatedLeaderCheckIntervalInMillis, TimeUnit.MILLISECONDS));
141     }
142
143     private void setElectionTimeoutFactor(long shardElectionTimeoutFactor) {
144         raftConfig.setElectionTimeoutFactor(shardElectionTimeoutFactor);
145     }
146
147     private void setSnapshotDataThresholdPercentage(int shardSnapshotDataThresholdPercentage) {
148         raftConfig.setSnapshotDataThresholdPercentage(shardSnapshotDataThresholdPercentage);
149     }
150
151     private void setSnapshotBatchCount(int shardSnapshotBatchCount) {
152         raftConfig.setSnapshotBatchCount(shardSnapshotBatchCount);
153     }
154
155     public static class Builder {
156         private DatastoreContext datastoreContext = new DatastoreContext();
157
158         public Builder shardTransactionIdleTimeout(Duration shardTransactionIdleTimeout) {
159             datastoreContext.shardTransactionIdleTimeout = shardTransactionIdleTimeout;
160             return this;
161         }
162
163         public Builder operationTimeoutInSeconds(int operationTimeoutInSeconds) {
164             datastoreContext.operationTimeoutInSeconds = operationTimeoutInSeconds;
165             return this;
166         }
167
168         public Builder dataStoreMXBeanType(String dataStoreMXBeanType) {
169             datastoreContext.dataStoreMXBeanType = dataStoreMXBeanType;
170             return this;
171         }
172
173         public Builder dataStoreProperties(InMemoryDOMDataStoreConfigProperties dataStoreProperties) {
174             datastoreContext.dataStoreProperties = dataStoreProperties;
175             return this;
176         }
177
178         public Builder shardTransactionCommitTimeoutInSeconds(int shardTransactionCommitTimeoutInSeconds) {
179             datastoreContext.shardTransactionCommitTimeoutInSeconds = shardTransactionCommitTimeoutInSeconds;
180             return this;
181         }
182
183         public Builder shardJournalRecoveryLogBatchSize(int shardJournalRecoveryLogBatchSize) {
184             datastoreContext.setShardJournalRecoveryLogBatchSize(shardJournalRecoveryLogBatchSize);
185             return this;
186         }
187
188         public Builder shardSnapshotBatchCount(int shardSnapshotBatchCount) {
189             datastoreContext.setSnapshotBatchCount(shardSnapshotBatchCount);
190             return this;
191         }
192
193         public Builder shardSnapshotDataThresholdPercentage(int shardSnapshotDataThresholdPercentage) {
194             datastoreContext.setSnapshotDataThresholdPercentage(shardSnapshotDataThresholdPercentage);
195             return this;
196         }
197
198         public Builder shardHeartbeatIntervalInMillis(int shardHeartbeatIntervalInMillis) {
199             datastoreContext.setHeartbeatInterval(shardHeartbeatIntervalInMillis);
200             return this;
201         }
202
203         public Builder shardTransactionCommitQueueCapacity(int shardTransactionCommitQueueCapacity) {
204             datastoreContext.shardTransactionCommitQueueCapacity = shardTransactionCommitQueueCapacity;
205             return this;
206         }
207
208         public Builder shardInitializationTimeout(long timeout, TimeUnit unit) {
209             datastoreContext.shardInitializationTimeout = new Timeout(timeout, unit);
210             return this;
211         }
212
213         public Builder shardLeaderElectionTimeout(long timeout, TimeUnit unit) {
214             datastoreContext.shardLeaderElectionTimeout = new Timeout(timeout, unit);
215             return this;
216         }
217
218         public Builder configurationReader(ConfigurationReader configurationReader){
219             datastoreContext.configurationReader = configurationReader;
220             return this;
221         }
222
223         public Builder persistent(boolean persistent){
224             datastoreContext.persistent = persistent;
225             return this;
226         }
227
228         public Builder shardIsolatedLeaderCheckIntervalInMillis(int shardIsolatedLeaderCheckIntervalInMillis) {
229             datastoreContext.setIsolatedLeaderCheckInterval(shardIsolatedLeaderCheckIntervalInMillis);
230             return this;
231         }
232
233         public Builder shardElectionTimeoutFactor(long shardElectionTimeoutFactor){
234             datastoreContext.setElectionTimeoutFactor(shardElectionTimeoutFactor);
235             return this;
236         }
237
238         public Builder transactionCreationInitialRateLimit(long initialRateLimit){
239             datastoreContext.transactionCreationInitialRateLimit = initialRateLimit;
240             return this;
241         }
242
243         public Builder dataStoreType(String dataStoreType){
244             datastoreContext.dataStoreType = dataStoreType;
245             datastoreContext.dataStoreMXBeanType = "Distributed" + WordUtils.capitalize(dataStoreType) + "Datastore";
246             return this;
247         }
248
249         public DatastoreContext build() {
250             return datastoreContext;
251         }
252     }
253 }