Browse Source

modify gateway can not get transaction service exception by special ledger

tags/1.1.11
shaozhuguang 5 years ago
parent
commit
3586fb582b
2 changed files with 15 additions and 32 deletions
  1. +14
    -10
      source/gateway/src/main/java/com/jd/blockchain/gateway/service/PeerConnectionManager.java
  2. +1
    -22
      source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java

+ 14
- 10
source/gateway/src/main/java/com/jd/blockchain/gateway/service/PeerConnectionManager.java View File

@@ -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<String> 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();


+ 1
- 22
source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java View File

@@ -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);
}
}


Loading…
Cancel
Save