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