From 3586fb582b27c354b36ba0884ceabc8d2f954063 Mon Sep 17 00:00:00 2001 From: shaozhuguang Date: Sun, 28 Jun 2020 11:25:17 +0800 Subject: [PATCH] modify gateway can not get transaction service exception by special ledger --- .../service/PeerConnectionManager.java | 24 +++++++++++-------- .../peer/web/ManagementController.java | 23 +----------------- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/PeerConnectionManager.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/PeerConnectionManager.java index 3164397e..d64879e1 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/PeerConnectionManager.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/PeerConnectionManager.java @@ -46,8 +46,6 @@ public class PeerConnectionManager implements PeerService, PeerConnector { private volatile PeerServiceFactory mostLedgerPeerServiceFactory; - private volatile PeerBlockchainServiceFactory masterPeerServiceFactory; - private volatile AsymmetricKeypair gateWayKeyPair; private volatile List peerProviders; @@ -85,10 +83,6 @@ public class PeerConnectionManager implements PeerService, PeerConnector { if (peerServiceFactory != null) { LOGGER.info("Connect peer {} success !!!", peerAddress); // 连接成功 - if (masterPeerServiceFactory == null) { - masterPeerServiceFactory = peerServiceFactory; - LOGGER.info("Master remote update to {}", peerAddress); - } if (mostLedgerPeerServiceFactory == null) { // 默认设置为第一个连接成功的,后续更新需要等待定时任务处理 mostLedgerPeerServiceFactory = new PeerServiceFactory(peerAddress, peerServiceFactory); @@ -136,6 +130,7 @@ public class PeerConnectionManager implements PeerService, PeerConnector { } } if (haveNewLedger) { + LOGGER.info("New ledger have been found, I will reconnect {} now !!!", peerAddress); // 有新账本的情况下重连,并更新本地账本 PeerBlockchainServiceFactory peerServiceFactory = PeerBlockchainServiceFactory.connect( gateWayKeyPair, peerAddress, peerProviders); @@ -144,7 +139,6 @@ public class PeerConnectionManager implements PeerService, PeerConnector { } } } - // 未连接成功的情况下不处理,等待定时连接线程来处理 } finally { ledgerHashLock.unlock(); } @@ -183,11 +177,11 @@ public class PeerConnectionManager implements PeerService, PeerConnector { @Override public TransactionService getTransactionService() { // 交易始终使用第一个连接成功的即可 - PeerBlockchainServiceFactory serviceFactory = this.masterPeerServiceFactory; - if (serviceFactory == null) { + PeerServiceFactory peerServiceFactory = mostLedgerPeerServiceFactory; + if (peerServiceFactory == null) { throw new IllegalStateException("Peer connection was closed!"); } - + PeerBlockchainServiceFactory serviceFactory = peerServiceFactory.serviceFactory; return serviceFactory.getTransactionService(); } @@ -312,6 +306,16 @@ public class PeerConnectionManager implements PeerService, PeerConnector { } catch (Exception e) { LOGGER.error(String.format("Peer[%s] get ledger[%s]'s latest block height fail !!!", entry.getKey(), ledgerHash.toBase58()), e); + // 此错误是由于对端的节点没有重连导致,需要进行重连操作 + NetworkAddress peerAddress = entry.getKey(); + try { + PeerBlockchainServiceFactory peerServiceFactory = PeerBlockchainServiceFactory.connect( + gateWayKeyPair, peerAddress, peerProviders); + peerBlockchainServiceFactories.put(peerAddress, peerServiceFactory); + } catch (Exception ee) { + LOGGER.error(String.format("Peer[%s] reconnect fail !!!", + entry.getKey()), e); + } } } else { defaultPeerAddress = entry.getKey(); diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java index 98362e6a..75b0fe30 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java @@ -175,30 +175,9 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag } try { clientIncomingSettings = peer.getManageService().authClientIncoming(authId); - - //add for test the gateway connect to peer0; 20200514; - if (clientIncomingSettings instanceof BftsmartClientIncomingSettings) { - BftsmartClientIncomingSettings bftsmartClientIncomingSettings = (BftsmartClientIncomingSettings) clientIncomingSettings; - byte[] topologyBytes = bftsmartClientIncomingSettings.getTopology(); - byte[] tomConfigBytes = bftsmartClientIncomingSettings.getTomConfig(); - BftsmartTopology topology = BinarySerializeUtils.deserialize(topologyBytes); - TOMConfiguration tomConfig = BinarySerializeUtils.deserialize(tomConfigBytes); - View view = topology.getView(); - if (view != null) { - // 打印view - int[] processes = view.getProcesses(); - for (int process : processes) { - InetSocketAddress address = view.getAddress(process); - System.out.printf("topology id = %s, address = %s \r\n", - process, address); - - System.out.printf("tomConfig id = %s, host = %s, port = %s \r\n", - process, tomConfig.getHost(process), tomConfig.getPort(process)); - } - } - } break; } catch (Exception e) { + LOGGER.error("Get authClientIncoming error", e); throw new AuthenticationServiceException(e.getMessage(), e); } }