mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-01-31 07:12:17 +00:00
Reformat the file.
This commit is contained in:
parent
d2e4284930
commit
0c5408e7c6
@ -21,7 +21,6 @@ import com.google.bitcoin.discovery.PeerDiscovery;
|
|||||||
import com.google.bitcoin.discovery.PeerDiscoveryException;
|
import com.google.bitcoin.discovery.PeerDiscoveryException;
|
||||||
import com.google.bitcoin.store.BlockStore;
|
import com.google.bitcoin.store.BlockStore;
|
||||||
import com.google.bitcoin.store.BlockStoreException;
|
import com.google.bitcoin.store.BlockStoreException;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -29,36 +28,32 @@ import java.io.IOException;
|
|||||||
import java.net.ConnectException;
|
import java.net.ConnectException;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.HashSet;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.Set;
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
import java.util.concurrent.*;
|
||||||
import java.util.concurrent.ThreadFactory;
|
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maintain a number of connections to peers.
|
* Maintain a number of connections to peers.
|
||||||
*
|
* <p/>
|
||||||
* <p>PeerGroup tries to maintain a constant number of connections to a set of distinct peers.
|
* <p>PeerGroup tries to maintain a constant number of connections to a set of distinct peers.
|
||||||
* Each peer runs a network listener in its own thread. When a connection is lost, a new peer
|
* Each peer runs a network listener in its own thread. When a connection is lost, a new peer
|
||||||
* will be tried after a delay as long as the number of connections less than the maximum.
|
* will be tried after a delay as long as the number of connections less than the maximum.
|
||||||
*
|
* <p/>
|
||||||
* <p>Connections are made to addresses from a provided list. When that list is exhausted,
|
* <p>Connections are made to addresses from a provided list. When that list is exhausted,
|
||||||
* we start again from the head of the list.
|
* we start again from the head of the list.
|
||||||
*
|
* <p/>
|
||||||
* <p>The PeerGroup can broadcast a transaction to the currently connected set of peers. It can
|
* <p>The PeerGroup can broadcast a transaction to the currently connected set of peers. It can
|
||||||
* also handle download of the blockchain from peers, restarting the process when peers die.
|
* also handle download of the blockchain from peers, restarting the process when peers die.
|
||||||
*
|
|
||||||
* @author miron@google.com (Miron Cuperman a.k.a devrandom)
|
|
||||||
*
|
*
|
||||||
|
* @author miron@google.com (Miron Cuperman a.k.a devrandom)
|
||||||
*/
|
*/
|
||||||
public class PeerGroup {
|
public class PeerGroup {
|
||||||
private static final int DEFAULT_CONNECTIONS = 4;
|
private static final int DEFAULT_CONNECTIONS = 4;
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(PeerGroup.class);
|
private static final Logger log = LoggerFactory.getLogger(PeerGroup.class);
|
||||||
|
|
||||||
public static final int DEFAULT_CONNECTION_DELAY_MILLIS = 5 * 1000;
|
public static final int DEFAULT_CONNECTION_DELAY_MILLIS = 5 * 1000;
|
||||||
private static final int CORE_THREADS = 1;
|
private static final int CORE_THREADS = 1;
|
||||||
private static final int THREAD_KEEP_ALIVE_SECONDS = 1;
|
private static final int THREAD_KEEP_ALIVE_SECONDS = 1;
|
||||||
@ -81,7 +76,7 @@ public class PeerGroup {
|
|||||||
private Set<PeerEventListener> peerEventListeners;
|
private Set<PeerEventListener> peerEventListeners;
|
||||||
// Peer discovery sources, will be polled occasionally if there aren't enough inactives.
|
// Peer discovery sources, will be polled occasionally if there aren't enough inactives.
|
||||||
private Set<PeerDiscovery> peerDiscoverers;
|
private Set<PeerDiscovery> peerDiscoverers;
|
||||||
|
|
||||||
private NetworkParameters params;
|
private NetworkParameters params;
|
||||||
private BlockStore blockStore;
|
private BlockStore blockStore;
|
||||||
private BlockChain chain;
|
private BlockChain chain;
|
||||||
@ -121,36 +116,42 @@ public class PeerGroup {
|
|||||||
public void addEventListener(PeerEventListener listener) {
|
public void addEventListener(PeerEventListener listener) {
|
||||||
peerEventListeners.add(listener);
|
peerEventListeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean removeEventListener(PeerEventListener listener) {
|
public boolean removeEventListener(PeerEventListener listener) {
|
||||||
return peerEventListeners.remove(listener);
|
return peerEventListeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Depending on the environment, this should normally be between 1 and 10, default is 4.
|
* Depending on the environment, this should normally be between 1 and 10, default is 4.
|
||||||
*
|
*
|
||||||
* @param maxConnections the maximum number of peer connections that this group will try to make.
|
* @param maxConnections the maximum number of peer connections that this group will try to make.
|
||||||
*/
|
*/
|
||||||
public void setMaxConnections(int maxConnections) {
|
public void setMaxConnections(int maxConnections) {
|
||||||
peerPool.setMaximumPoolSize(maxConnections);
|
peerPool.setMaximumPoolSize(maxConnections);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxConnections() {
|
public int getMaxConnections() {
|
||||||
return peerPool.getMaximumPoolSize();
|
return peerPool.getMaximumPoolSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add an address to the list of potential peers to connect to */
|
/**
|
||||||
|
* Add an address to the list of potential peers to connect to
|
||||||
|
*/
|
||||||
public void addAddress(PeerAddress peerAddress) {
|
public void addAddress(PeerAddress peerAddress) {
|
||||||
// TODO(miron) consider deduplication
|
// TODO(miron) consider deduplication
|
||||||
inactives.add(peerAddress);
|
inactives.add(peerAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add addresses from a discovery source to the list of potential peers to connect to */
|
/**
|
||||||
|
* Add addresses from a discovery source to the list of potential peers to connect to
|
||||||
|
*/
|
||||||
public void addPeerDiscovery(PeerDiscovery peerDiscovery) {
|
public void addPeerDiscovery(PeerDiscovery peerDiscovery) {
|
||||||
peerDiscoverers.add(peerDiscovery);
|
peerDiscoverers.add(peerDiscovery);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Starts the background thread that makes connections. */
|
/**
|
||||||
|
* Starts the background thread that makes connections.
|
||||||
|
*/
|
||||||
public void start() {
|
public void start() {
|
||||||
this.connectThread = new Thread(new PeerExecutionRunnable(), "Peer group thread");
|
this.connectThread = new Thread(new PeerExecutionRunnable(), "Peer group thread");
|
||||||
running = true;
|
running = true;
|
||||||
@ -159,7 +160,7 @@ public class PeerGroup {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Stop this PeerGroup
|
* Stop this PeerGroup
|
||||||
*
|
* <p/>
|
||||||
* <p>The peer group will be asynchronously shut down. After it is shut down
|
* <p>The peer group will be asynchronously shut down. After it is shut down
|
||||||
* all peers will be disconnected and no threads will be running.
|
* all peers will be disconnected and no threads will be running.
|
||||||
*/
|
*/
|
||||||
@ -171,7 +172,7 @@ public class PeerGroup {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Broadcast a transaction to all connected peers
|
* Broadcast a transaction to all connected peers
|
||||||
*
|
*
|
||||||
* @return whether we sent to at least one peer
|
* @return whether we sent to at least one peer
|
||||||
*/
|
*/
|
||||||
public boolean broadcastTransaction(Transaction tx) {
|
public boolean broadcastTransaction(Transaction tx) {
|
||||||
@ -193,7 +194,7 @@ public class PeerGroup {
|
|||||||
/**
|
/**
|
||||||
* Repeatedly get the next peer address from the inactive queue
|
* Repeatedly get the next peer address from the inactive queue
|
||||||
* and try to connect.
|
* and try to connect.
|
||||||
*
|
* <p/>
|
||||||
* <p>We can be terminated with Thread.interrupt. When an interrupt is received,
|
* <p>We can be terminated with Thread.interrupt. When an interrupt is received,
|
||||||
* we will ask the executor to shutdown and ask each peer to disconnect. At that point
|
* we will ask the executor to shutdown and ask each peer to disconnect. At that point
|
||||||
* no threads or network connections will be active.
|
* no threads or network connections will be active.
|
||||||
@ -206,7 +207,7 @@ public class PeerGroup {
|
|||||||
} else {
|
} else {
|
||||||
tryNextPeer();
|
tryNextPeer();
|
||||||
}
|
}
|
||||||
|
|
||||||
// We started a new peer connection, delay before trying another one
|
// We started a new peer connection, delay before trying another one
|
||||||
Thread.sleep(connectionDelayMillis);
|
Thread.sleep(connectionDelayMillis);
|
||||||
}
|
}
|
||||||
@ -242,7 +243,9 @@ public class PeerGroup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Try connecting to a peer. If we exceed the number of connections, delay and try again. */
|
/**
|
||||||
|
* Try connecting to a peer. If we exceed the number of connections, delay and try again.
|
||||||
|
*/
|
||||||
private void tryNextPeer() throws InterruptedException {
|
private void tryNextPeer() throws InterruptedException {
|
||||||
final PeerAddress address = inactives.take();
|
final PeerAddress address = inactives.take();
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -295,7 +298,7 @@ public class PeerGroup {
|
|||||||
running = false;
|
running = false;
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we got here, we should retry this address because an error unrelated
|
// If we got here, we should retry this address because an error unrelated
|
||||||
// to the peer has occurred.
|
// to the peer has occurred.
|
||||||
Thread.sleep(connectionDelayMillis);
|
Thread.sleep(connectionDelayMillis);
|
||||||
@ -305,10 +308,10 @@ public class PeerGroup {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Start downloading the blockchain from the first available peer.
|
* Start downloading the blockchain from the first available peer.
|
||||||
*
|
* <p/>
|
||||||
* <p>If no peers are currently connected, the download will be started
|
* <p>If no peers are currently connected, the download will be started
|
||||||
* once a peer starts. If the peer dies, the download will resume with another peer.
|
* once a peer starts. If the peer dies, the download will resume with another peer.
|
||||||
*
|
*
|
||||||
* @param listener a listener for chain download events, may not be null
|
* @param listener a listener for chain download events, may not be null
|
||||||
*/
|
*/
|
||||||
public synchronized void startBlockChainDownload(PeerEventListener listener) {
|
public synchronized void startBlockChainDownload(PeerEventListener listener) {
|
||||||
@ -317,16 +320,15 @@ public class PeerGroup {
|
|||||||
// downloading from multiple peers and handle the case when a new peer comes along
|
// downloading from multiple peers and handle the case when a new peer comes along
|
||||||
// with a longer chain after we thought we were done.
|
// with a longer chain after we thought we were done.
|
||||||
synchronized (peers) {
|
synchronized (peers) {
|
||||||
if (!peers.isEmpty())
|
if (!peers.isEmpty()) {
|
||||||
{
|
|
||||||
startBlockChainDownloadFromPeer(peers.iterator().next());
|
startBlockChainDownloadFromPeer(peers.iterator().next());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Download the blockchain from peers.<p>
|
* Download the blockchain from peers.<p>
|
||||||
*
|
* <p/>
|
||||||
* This method waits until the download is complete. "Complete" is defined as downloading
|
* This method waits until the download is complete. "Complete" is defined as downloading
|
||||||
* from at least one peer all the blocks that are in that peer's inventory.
|
* from at least one peer all the blocks that are in that peer's inventory.
|
||||||
*/
|
*/
|
||||||
@ -339,7 +341,7 @@ public class PeerGroup {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected synchronized void handleNewPeer(Peer peer) {
|
protected synchronized void handleNewPeer(Peer peer) {
|
||||||
if (downloadListener != null && downloadPeer == null)
|
if (downloadListener != null && downloadPeer == null)
|
||||||
startBlockChainDownloadFromPeer(peer);
|
startBlockChainDownloadFromPeer(peer);
|
||||||
@ -351,7 +353,7 @@ public class PeerGroup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected synchronized void handlePeerDeath(Peer peer) {
|
protected synchronized void handlePeerDeath(Peer peer) {
|
||||||
if (peer == downloadPeer) {
|
if (peer == downloadPeer) {
|
||||||
downloadPeer = null;
|
downloadPeer = null;
|
||||||
@ -381,7 +383,7 @@ public class PeerGroup {
|
|||||||
}
|
}
|
||||||
downloadPeer = peer;
|
downloadPeer = peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class PeerGroupThreadFactory implements ThreadFactory {
|
static class PeerGroupThreadFactory implements ThreadFactory {
|
||||||
static final AtomicInteger poolNumber = new AtomicInteger(1);
|
static final AtomicInteger poolNumber = new AtomicInteger(1);
|
||||||
final ThreadGroup group;
|
final ThreadGroup group;
|
||||||
@ -391,14 +393,14 @@ public class PeerGroup {
|
|||||||
PeerGroupThreadFactory() {
|
PeerGroupThreadFactory() {
|
||||||
group = Thread.currentThread().getThreadGroup();
|
group = Thread.currentThread().getThreadGroup();
|
||||||
namePrefix = "PeerGroup-" +
|
namePrefix = "PeerGroup-" +
|
||||||
poolNumber.getAndIncrement() +
|
poolNumber.getAndIncrement() +
|
||||||
"-thread-";
|
"-thread-";
|
||||||
}
|
}
|
||||||
|
|
||||||
public Thread newThread(Runnable r) {
|
public Thread newThread(Runnable r) {
|
||||||
Thread t = new Thread(group, r,
|
Thread t = new Thread(group, r,
|
||||||
namePrefix + threadNumber.getAndIncrement(),
|
namePrefix + threadNumber.getAndIncrement(),
|
||||||
0);
|
0);
|
||||||
// Lower the priority of the peer threads. This is to avoid competing with UI threads created by the API
|
// Lower the priority of the peer threads. This is to avoid competing with UI threads created by the API
|
||||||
// user when doing lots of work, like downloading the block chain. We select a priority level one lower
|
// user when doing lots of work, like downloading the block chain. We select a priority level one lower
|
||||||
// than the parent thread, or the minimum.
|
// than the parent thread, or the minimum.
|
||||||
|
Loading…
Reference in New Issue
Block a user