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