2 * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.cluster.datastore;
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;
22 * Contains contextual data for a data store.
24 * @author Thomas Pantelis
26 public class DatastoreContext {
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;
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;
64 public static Builder newBuilder() {
68 public InMemoryDOMDataStoreConfigProperties getDataStoreProperties() {
69 return dataStoreProperties;
72 public Duration getShardTransactionIdleTimeout() {
73 return shardTransactionIdleTimeout;
76 public String getDataStoreMXBeanType() {
77 return dataStoreMXBeanType;
80 public int getOperationTimeoutInSeconds() {
81 return operationTimeoutInSeconds;
84 public ConfigParams getShardRaftConfig() {
85 return shardRaftConfig;
88 public int getShardTransactionCommitTimeoutInSeconds() {
89 return shardTransactionCommitTimeoutInSeconds;
92 public int getShardTransactionCommitQueueCapacity() {
93 return shardTransactionCommitQueueCapacity;
96 public Timeout getShardInitializationTimeout() {
97 return shardInitializationTimeout;
100 public Timeout getShardLeaderElectionTimeout() {
101 return shardLeaderElectionTimeout;
104 public boolean isPersistent() {
108 public ConfigurationReader getConfigurationReader() {
109 return configurationReader;
112 public long getShardElectionTimeoutFactor(){
113 return this.shardElectionTimeoutFactor;
117 public long getTransactionCreationInitialRateLimit() {
118 return transactionCreationInitialRateLimit;
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;
140 public Builder shardTransactionIdleTimeout(Duration shardTransactionIdleTimeout) {
141 this.shardTransactionIdleTimeout = shardTransactionIdleTimeout;
145 public Builder operationTimeoutInSeconds(int operationTimeoutInSeconds) {
146 this.operationTimeoutInSeconds = operationTimeoutInSeconds;
150 public Builder dataStoreMXBeanType(String dataStoreMXBeanType) {
151 this.dataStoreMXBeanType = dataStoreMXBeanType;
155 public Builder dataStoreProperties(InMemoryDOMDataStoreConfigProperties dataStoreProperties) {
156 this.dataStoreProperties = dataStoreProperties;
160 public Builder shardTransactionCommitTimeoutInSeconds(int shardTransactionCommitTimeoutInSeconds) {
161 this.shardTransactionCommitTimeoutInSeconds = shardTransactionCommitTimeoutInSeconds;
165 public Builder shardJournalRecoveryLogBatchSize(int shardJournalRecoveryLogBatchSize) {
166 this.shardJournalRecoveryLogBatchSize = shardJournalRecoveryLogBatchSize;
170 public Builder shardSnapshotBatchCount(int shardSnapshotBatchCount) {
171 this.shardSnapshotBatchCount = shardSnapshotBatchCount;
175 public Builder shardSnapshotDataThresholdPercentage(int shardSnapshotDataThresholdPercentage) {
176 this.shardSnapshotDataThresholdPercentage = shardSnapshotDataThresholdPercentage;
181 public Builder shardHeartbeatIntervalInMillis(int shardHeartbeatIntervalInMillis) {
182 this.shardHeartbeatIntervalInMillis = shardHeartbeatIntervalInMillis;
186 public Builder shardTransactionCommitQueueCapacity(int shardTransactionCommitQueueCapacity) {
187 this.shardTransactionCommitQueueCapacity = shardTransactionCommitQueueCapacity;
191 public Builder shardInitializationTimeout(long timeout, TimeUnit unit) {
192 this.shardInitializationTimeout = new Timeout(timeout, unit);
196 public Builder shardLeaderElectionTimeout(long timeout, TimeUnit unit) {
197 this.shardLeaderElectionTimeout = new Timeout(timeout, unit);
201 public Builder configurationReader(ConfigurationReader configurationReader){
202 this.configurationReader = configurationReader;
206 public Builder persistent(boolean persistent){
207 this.persistent = persistent;
211 public Builder shardIsolatedLeaderCheckIntervalInMillis(int shardIsolatedLeaderCheckIntervalInMillis) {
212 this.shardIsolatedLeaderCheckIntervalInMillis = shardIsolatedLeaderCheckIntervalInMillis;
216 public Builder shardElectionTimeoutFactor(long shardElectionTimeoutFactor){
217 this.shardElectionTimeoutFactor = shardElectionTimeoutFactor;
221 public Builder transactionCreationInitialRateLimit(long initialRateLimit){
222 this.transactionCreationInitialRateLimit = initialRateLimit;
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));
238 return new DatastoreContext(dataStoreProperties, raftConfig, dataStoreMXBeanType,
239 operationTimeoutInSeconds, shardTransactionIdleTimeout,
240 shardTransactionCommitTimeoutInSeconds, shardTransactionCommitQueueCapacity,
241 shardInitializationTimeout, shardLeaderElectionTimeout,
242 persistent, configurationReader, shardElectionTimeoutFactor, transactionCreationInitialRateLimit);