Browse Source

增加线程阻塞,处理决定结果为NULL的问题

tags/1.1.0
shaozhuguang 5 years ago
parent
commit
48e0f09f74
2 changed files with 31 additions and 21 deletions
  1. +3
    -10
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java
  2. +28
    -11
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java

+ 3
- 10
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ContractCodeDeployOperationHandle.java View File

@@ -1,15 +1,9 @@
package com.jd.blockchain.ledger.core.handles;

import com.jd.blockchain.contract.ContractJarUtils;
import com.jd.blockchain.ledger.ContractCodeDeployOperation;
import com.jd.blockchain.ledger.LedgerPermission;
import com.jd.blockchain.ledger.core.LedgerDataQuery;
import com.jd.blockchain.ledger.core.LedgerDataset;
import com.jd.blockchain.ledger.core.LedgerService;
import com.jd.blockchain.ledger.core.MultiIDsPolicy;
import com.jd.blockchain.ledger.core.OperationHandleContext;
import com.jd.blockchain.ledger.core.SecurityContext;
import com.jd.blockchain.ledger.core.SecurityPolicy;
import com.jd.blockchain.ledger.core.TransactionRequestExtension;
import com.jd.blockchain.ledger.core.*;

public class ContractCodeDeployOperationHandle extends AbstractLedgerOperationHandle<ContractCodeDeployOperation> {

@@ -19,11 +13,10 @@ public class ContractCodeDeployOperationHandle extends AbstractLedgerOperationHa

@Override
protected void doProcess(ContractCodeDeployOperation op, LedgerDataset newBlockDataset,
TransactionRequestExtension requestContext, LedgerDataQuery previousBlockDataset,
OperationHandleContext handleContext, LedgerService ledgerService) {
TransactionRequestExtension requestContext, LedgerQuery ledger,
OperationHandleContext handleContext) {


// TODO: 请求者应该提供合约账户的公钥签名,以确保注册人对注册的地址和公钥具有合法的使用权;

// 权限校验;


+ 28
- 11
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java View File

@@ -6,6 +6,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
@@ -60,6 +61,12 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI

private static final String DEFAULT_SIGN_ALGORITHM = "ED25519";

/**
* 决定值列表并发处理,必须等待Local释放
*
*/
private final CountDownLatch decisionsCountDownLatch = new CountDownLatch(1);

private final SignatureFunction SIGN_FUNC;

private volatile LedgerInitConfiguration ledgerInitConfig;
@@ -190,18 +197,25 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
}

public LedgerInitDecision makeLocalDecision(PrivKey privKey) {
// 生成账本;
initializer.prepareLedger(dbConn.getStorageService(), getNodesSignatures());

// 生成签名决定;
this.localDecision = makeDecision(currentId, initializer.getLedgerHash(), privKey);
this.decisions = new DecisionResultHandle[ledgerInitConfig.getParticipantCount()];
for (int i = 0; i < decisions.length; i++) {
// 参与者的 id 是依次递增的;
this.decisions[i] = new DecisionResultHandle(i);

try {
// 生成账本;
initializer.prepareLedger(dbConn.getStorageService(), getNodesSignatures());

// 生成签名决定;
this.localDecision = makeDecision(currentId, initializer.getLedgerHash(), privKey);
this.decisions = new DecisionResultHandle[ledgerInitConfig.getParticipantCount()];
for (int i = 0; i < decisions.length; i++) {
// 参与者的 id 是依次递增的;
this.decisions[i] = new DecisionResultHandle(i);
}
// 预置当前参与方的“决定”到列表,避免向自己发起请求;
this.decisions[currentId].setValue(localDecision);
} finally {
// 释放,以便于其他节点接收
this.decisionsCountDownLatch.countDown();
}
// 预置当前参与方的“决定”到列表,避免向自己发起请求;
this.decisions[currentId].setValue(localDecision);

return localDecision;
}

@@ -678,6 +692,9 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI

try {

// 必须等待本地处理完成,此处线程阻塞
this.decisionsCountDownLatch.await();

DecisionResultHandle resultHandle = this.decisions[remoteId];
if (!validateAndRecordDecision(initDecision, resultHandle)) {
// 签名无效;


Loading…
Cancel
Save