/** * Licensed to the zk1931 under one or more contributor license * agreements. See the NOTICE file distributed with this work * for additional information regarding copyright ownership. * The ASF licenses this file to you 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 com.github.zk1931.jzab; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.concurrent.BlockingQueue; import com.github.zk1931.jzab.proto.ZabMessage.Message; import com.github.zk1931.jzab.Zab.StateChangeCallback; import com.github.zk1931.jzab.Zab.FailureCaseCallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Participant state. It will be passed accross different instances of * Leader/Follower class during the lifetime of Zab. */ class ParticipantState { /** * Persistent variables for Zab. */ private final PersistentState persistence; /** * The last delivered zxid. It's not persisted to disk. Just a place holder * to pass between Follower/Leader. */ private Zxid lastDeliveredZxid = Zxid.ZXID_NOT_EXIST; /** * Message queue. The receiving callback simply parses the message and puts * it in queue, it's up to Leader/Follower/Election to take out * and process the message. */ private final BlockingQueue<MessageTuple> messageQueue; /** * Used for communication between nodes. */ private final Transport transport; /** * Server ID of the Participant. */ private final String serverId; /** * The synchronization timeout in milliseconds. It will be adjusted * dynamically. */ private int syncTimeoutMs; /** * The object for leader election. */ private final Election election; /** * Callbacks for state change. Used for testing only. */ private StateChangeCallback stateChangeCallback = null; /** * Callbacks for simulating failures. Used for testing only. */ private FailureCaseCallback failureCallback = null; private static final Logger LOG = LoggerFactory.getLogger(ParticipantState.class); ParticipantState(PersistentState persistence, String serverId, Transport transport, BlockingQueue<MessageTuple> messageQueue, StateChangeCallback stCallback, FailureCaseCallback failureCallback, int syncTimeoutMs, Election election) throws IOException , GeneralSecurityException { this.persistence = persistence; this.serverId = serverId; this.messageQueue = messageQueue; this.stateChangeCallback = stCallback; this.failureCallback = failureCallback; this.transport = transport; this.syncTimeoutMs = syncTimeoutMs; this.election = election; } public BlockingQueue<MessageTuple> getMessageQueue() { return this.messageQueue; } public String getServerId() { return this.serverId; } public Transport getTransport() { return this.transport; } public PersistentState getPersistence() { return this.persistence; } public Zxid getLastDeliveredZxid() { return this.lastDeliveredZxid; } public int getSyncTimeoutMs() { return this.syncTimeoutMs; } public void setSyncTimeoutMs(int timeoutMs) { this.syncTimeoutMs = timeoutMs; } public void updateLastDeliveredZxid(Zxid zxid) { this.lastDeliveredZxid = zxid; } public StateChangeCallback getStateChangeCallback() { return this.stateChangeCallback; } public FailureCaseCallback getFailureCaseCallback() { return this.failureCallback; } public Election getElection() { return this.election; } public void enqueueShutdown() { Message shutdown = MessageBuilder.buildShutDown(); this.messageQueue.add(new MessageTuple(this.serverId, shutdown)); } public void enqueueMessage(MessageTuple tuple) { this.messageQueue.add(tuple); } }