blob: d1f83392ca5d6e7869e4f9f7d50451e43257b6bb [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.rep.elections;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Logger;
import com.sleepycat.je.dbi.EnvironmentImpl;
import com.sleepycat.je.rep.impl.node.RepNode;
import com.sleepycat.je.rep.net.DataChannel;
import com.sleepycat.je.rep.utilint.RepUtils;
import com.sleepycat.je.rep.utilint.ReplicationFormatter;
import com.sleepycat.je.utilint.LoggerUtils;
import com.sleepycat.je.utilint.StoppableThread;
/**
* ElectionAgentThread is the base class for the election agent threads
* underlying the Acceptor and Learner agents.
*/
public class ElectionAgentThread extends StoppableThread {
/* The instance of the protocol bound to a specific Value and Proposal */
protected final Protocol protocol;
protected final Logger logger;
/*
* Used when the unit test AcceptorTest creates a RepNode without a RepIml
* instance.
*/
protected final ReplicationFormatter formatter;
/*
* The queue into which the ServiceDispatcher queues socket channels for
* new Feeder instances.
*/
protected final BlockingQueue<DataChannel> channelQueue =
new LinkedBlockingQueue<>();
protected ElectionAgentThread(RepNode repNode,
Protocol protocol,
String threadName) {
super((repNode == null ? null : repNode.getRepImpl()), threadName);
this.protocol = protocol;
logger = (envImpl != null) ?
LoggerUtils.getLogger(getClass()) :
LoggerUtils.getLoggerFormatterNeeded(getClass());
formatter = new ReplicationFormatter(protocol.getNameIdPair());
}
protected ElectionAgentThread(EnvironmentImpl envImpl,
Protocol protocol,
String threadName) {
super(envImpl, threadName);
this.protocol = protocol;
logger = (envImpl != null) ?
LoggerUtils.getLogger(getClass()) :
LoggerUtils.getLoggerFormatterNeeded(getClass());
formatter = new ReplicationFormatter(protocol.getNameIdPair());
}
@Override
protected Logger getLogger() {
return logger;
}
/**
* Shuts down the Agent.
* @throws InterruptedException
*/
public void shutdown()
throws InterruptedException{
if (shutdownDone(logger)) {
return;
}
shutdownThread(logger);
}
@Override
protected int initiateSoftShutdown() {
channelQueue.clear();
/* Add special entry so that the channelQueue.poll operation exits. */
channelQueue.add(RepUtils.CHANNEL_EOF_MARKER);
return 0;
}
}