/** * Copyright (c) 2015 The original author or authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.reveno.atp.clustering.core; import org.reveno.atp.clustering.api.*; import org.reveno.atp.utils.MeasureUtils; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class RevenoClusterConfiguration implements ClusterConfiguration { protected static final long DEFAULT_TIMEOUT = MeasureUtils.sec(5); @Override public void currentNodeAddress(String host, String port, String nodeId) { this.nodeAddress = new InetAddress(host + ":" + port, nodeId, IOMode.ASYNC); } @Override public void currentNodeAddress(String host, String port, String nodeId, IOMode mode) { this.nodeAddress = new InetAddress(host + ":" + port, nodeId, mode); } @Override public void currentNodeAddress(Address nodeAddress) { this.nodeAddress = nodeAddress; if (sync.port == 0 && nodeAddress instanceof InetAddress) { sync.port = ((InetAddress) nodeAddress).getPort() + 10; } } public Address currentNodeAddress() { return nodeAddress; } @Override public void nodesInetAddresses(List<InetAddress> addresses) { this.nodeAddresses.addAll(addresses); } @Override public void nodesAddresses(List<Address> nodeAddresses) { this.nodeAddresses = nodeAddresses; } public List<Address> nodesAddresses() { return Collections.unmodifiableList(nodeAddresses); } @Override public void commandsXmitTransport(CommandsXmitTransport transport) { this.transport = transport; } public CommandsXmitTransport commandsXmitTransport() { return transport; } @Override public MulticastConfiguration multicast() { return multicast; } public RevenoMulticastConfiguration revenoMulticast() { return multicast; } @Override public UnicastConfiguration unicast() { return unicast; } public RevenoUnicastConfiguration revenoUnicast() { return unicast; } @Override public TimeoutsConfiguration electionTimeouts() { return timeouts; } public RevenoTimeoutsConfiguration revenoElectionTimeouts() { return timeouts; } @Override public SyncConfiguration dataSync() { return sync; } public RevenoSyncConfiguration revenoDataSync() { return sync; } @Override public void authToken(String authToken) { this.authToken = authToken; } public String authToken() { return authToken; } @Override public void priorityInCluster(int priority) { this.priority = priority; } public int priorityInCluster() { return priority; } protected Address nodeAddress; protected List<Address> nodeAddresses = new LinkedList<>(); protected int priority = 1; protected String authToken; protected CommandsXmitTransport transport = CommandsXmitTransport.UNICAST; protected RevenoTimeoutsConfiguration timeouts = new RevenoTimeoutsConfiguration(); protected RevenoSyncConfiguration sync = new RevenoSyncConfiguration(); protected RevenoMulticastConfiguration multicast = new RevenoMulticastConfiguration(); protected RevenoUnicastConfiguration unicast = new RevenoUnicastConfiguration(); public static class RevenoTimeoutsConfiguration implements TimeoutsConfiguration { @Override public void voteTimeoutNanos(long timeout) { this.voteTimeout = timeout; } public long voteTimeoutNanos() { return voteTimeout; } @Override public void syncTimeoutNanos(long timeout) { this.syncTimeout = timeout; } public long syncTimeoutNanos() { return syncTimeout; } @Override public void ackTimeoutNanos(long timeout) { this.ackTimeout = timeout; } public long ackTimeoutNanos() { return ackTimeout; } @Override public void barrierTimeoutNanos(long timeout) { this.barrierTimeout = timeout; } public long barrierTimeoutNanos() { return barrierTimeout; } @Override public void syncBarrierTimeoutNanos(long timeout) { this.syncBarrierTimeoutNanos = timeout; } public long syncBarrierTimeoutNanos() { return syncBarrierTimeoutNanos; } protected long voteTimeout = DEFAULT_TIMEOUT; protected long syncTimeout = DEFAULT_TIMEOUT; protected long ackTimeout = DEFAULT_TIMEOUT; protected long barrierTimeout = MeasureUtils.sec(10); protected long syncBarrierTimeoutNanos = MeasureUtils.sec(3 * 60); } public static class RevenoSyncConfiguration implements SyncConfiguration { @Override public void mode(SyncMode mode) { this.mode = mode; } public SyncMode mode() { return mode; } @Override public void port(int port) { this.port = port; } public int port() { return port; } @Override public void waitAllNodesSync(boolean wait) { this.waitAllNodesSync = wait; } public boolean waitAllNodesSync() { return waitAllNodesSync; } @Override public void retries(int count) { this.retries = count; } public int retries() { return retries; } @Override public void threadPoolSize(int threads) { this.threadPoolSize = threads; } public int threadPoolSize() { return threadPoolSize; } protected int threadPoolSize = 10; protected int retries = 100; protected SyncMode mode = SyncMode.SNAPSHOT; protected int port; protected boolean waitAllNodesSync = true; } public static class RevenoMulticastConfiguration implements MulticastConfiguration { @Override public void host(String host) { this.host = host; } public String host() { return host; } @Override public void port(int port) { this.port = port; } public int port() { return port; } @Override public void netInterface(String netInterface) { this.netInterface = netInterface; } public String netInterface() { return netInterface; } @Override public void receiveBufferSize(int size) { this.receiveBufferSize = size; } public int receiveBufferSize() { return receiveBufferSize; } @Override public void sendBufferSize(int size) { this.sendBufferSize = size; } public int sendBufferSize() { return sendBufferSize; } @Override public void packetsPerSecond(int pps) { this.packetsPerSecond = pps; } public int packetsPerSecond() { return packetsPerSecond; } @Override public void spinLoopMicros(int micros) { this.spinLoopMicros = micros; } public int spinLoopMicros() { return spinLoopMicros; } @Override public void threadParkMicros(int micros) { this.threadParkMicros = micros; } public int threadParkMicros() { return threadParkMicros; } @Override public void retransmitPacketsHistory(int packets) { this.retransmitPacketsHistory = packets; } public int retransmitPacketsHistory() { return retransmitPacketsHistory; } @Override public void packetSize(int size) { this.datagramSize = size; } public int datagramSize() { return datagramSize; } @Override public void preferBatchingToLatency(boolean batching) { this.preferBatchingToLatency = batching; } public boolean preferBatchingToLatency() { return preferBatchingToLatency; } @Override public void ttl(int ttl) { this.ttl = ttl; } public int ttl() { return ttl; } @Override public void sendRetries(int retries) { this.sendRetries = retries; } public int sendRetries() { return sendRetries; } protected String host; protected int port; protected String netInterface = "127.0.0.1"; protected int receiveBufferSize = 1024 * 1024; protected int sendBufferSize = 1024 * 1024; protected int packetsPerSecond = 3_000; protected int spinLoopMicros = 0; protected int threadParkMicros = 20; protected int retransmitPacketsHistory = 9_000; protected int datagramSize = 1000; protected int ttl = 8; protected boolean preferBatchingToLatency = true; protected int sendRetries = 15; } public static class RevenoUnicastConfiguration implements UnicastConfiguration { @Override public void receiveBufferSize(int size) { this.receiveBufferSize = size; } public int receiveBufferSize() { return receiveBufferSize; } @Override public void sendBufferSize(int size) { this.sendBufferSize = size; } public int sendBufferSize() { return sendBufferSize; } @Override public void pingTimeoutMillis(int pingTimeout) { this.pingTimeoutMls = pingTimeout; } public int pingTimeoutMillis() { return pingTimeoutMls; } @Override public void minReceiveThreads(int threads) { this.minReceiveThreads = threads; } public int minReceiveThreads() { return minReceiveThreads; } @Override public void maxReceiveThreads(int threads) { this.maxReceiveThreads = threads; } public int maxReceiveThreads() { return maxReceiveThreads; } @Override public void receiveQueueMaxSize(int size) { this.receiveQueueMaxSize = size; } public int receiveQueueMaxSize() { return receiveQueueMaxSize; } @Override public void maxReadBatchMessages(int size) { this.maxReadBatchMessages = size; } public int maxReadBatchMessages() { return maxReadBatchMessages; } @Override public void retransmitIntervalMillis(int millis) { this.retransmitIntervalMillis = millis; } public int retransmitIntervalMillis() { return retransmitIntervalMillis; } @Override public void maxRetransmitTimeMillis(int millis) { this.maxRetransmitTimeMillis = millis; } public int maxRetransmitTimeMillis() { return maxRetransmitTimeMillis; } protected int receiveBufferSize = 1024 * 1024; protected int sendBufferSize = 1024 * 1024; protected int pingTimeoutMls = 5000; protected int maxReceiveThreads = 1; protected int minReceiveThreads = 1; protected int receiveQueueMaxSize = 0; protected int maxReadBatchMessages = 10; protected int retransmitIntervalMillis = 1000; protected int maxRetransmitTimeMillis = 3000; } }