From a258a8693f664d4fe93f36279dbeec1ae80e3389 Mon Sep 17 00:00:00 2001 From: liuyuanmu Date: Thu, 21 Nov 2019 10:27:13 +0800 Subject: [PATCH] fix DataVersionConflictException bug --- .../bftsmart/service/BftsmartNodeServer.java | 4 --- .../core/TransactionBatchProcessor.java | 5 ++-- .../core/TransactionBatchProcessorTest.java | 29 +++++-------------- .../ledger/DataVersionConflictException.java | 2 +- 4 files changed, 10 insertions(+), 30 deletions(-) diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java index 297ccebe..e3eddc68 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java @@ -410,10 +410,6 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer } catch (BlockRollbackException e) { LOGGER.error("Error occurred while processing ordered messages! --" + e.getMessage(), e); isOK = false; - // TODO: handle the BlockRollbackException in detail; - if (e instanceof DataVersionConflictException) { - transactionState = TransactionState.DATA_VERSION_CONFLICT; - } break; } } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java index 3d2ebed9..e347f101 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java @@ -273,9 +273,6 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { // rollback all the block; // TODO: handle the BlockRollbackException in detail; result = TransactionState.IGNORED_BY_BLOCK_FULL_ROLLBACK; - if (e instanceof DataVersionConflictException) { - result = TransactionState.DATA_VERSION_CONFLICT; - } txCtx.rollback(); LOGGER.error( String.format("Transaction was rolled back! --[BlockHeight=%s][RequestHash=%s][TxHash=%s] --%s", @@ -295,6 +292,8 @@ public class TransactionBatchProcessor implements TransactionBatchProcess { result = TransactionState.CONTRACT_DOES_NOT_EXIST; } else if (e instanceof ParticipantDoesNotExistException) { result = TransactionState.PARTICIPANT_DOES_NOT_EXIST; + } else if (e instanceof DataVersionConflictException) { + result = TransactionState.DATA_VERSION_CONFLICT; } txCtx.discardAndCommit(result, operationResults); LOGGER.error(String.format( diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java index 06bf987d..6a1b6ed8 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java @@ -365,17 +365,16 @@ public class TransactionBatchProcessorTest { txbatchProcessor.schedule(txreq5); // 预期会产生版本冲突异常; DataVersionConflictionException; - DataVersionConflictException versionConflictionException = null; - try { - txbatchProcessor.schedule(txreq6); - } catch (DataVersionConflictException e) { - versionConflictionException = e; - } - assertNotNull(versionConflictionException); + TransactionResponse resp = txbatchProcessor.schedule(txreq6); + assertFalse(resp.isSuccess()); + // 提交新区块 newBlock = newBlockEditor.prepare(); newBlockEditor.commit(); + // 预期区块高度为3 + assertEquals(3, ledgerRepo.getLatestBlockHeight()); + BytesValue v1 = ledgerRepo.getDataAccountSet().getAccount(dataAccountKeypair.getAddress()).getBytes("K1"); v3 = ledgerRepo.getDataAccountSet().getAccount(dataAccountKeypair.getAddress()).getBytes("K3"); @@ -383,7 +382,7 @@ public class TransactionBatchProcessorTest { long k1_version = ledgerRepo.getDataAccountSet().getAccount(dataAccountKeypair.getAddress()) .getDataVersion("K1"); assertEquals(1, k1_version); - + // K3 的版本增1 long k3_version = ledgerRepo.getDataAccountSet().getAccount(dataAccountKeypair.getAddress()) .getDataVersion("K3"); assertEquals(1, k3_version); @@ -393,20 +392,6 @@ public class TransactionBatchProcessorTest { assertEquals("V-1-2", v1.getValue().toUTF8String()); assertEquals("V-3-2", v3.getValue().toUTF8String()); -// // 验证正确性; -// ledgerManager = new LedgerManager(); -// ledgerRepo = ledgerManager.register(ledgerHash, STORAGE); -// -// LedgerBlock latestBlock = ledgerRepo.getLatestBlock(); -// assertEquals(newBlock.getHash(), latestBlock.getHash()); -// assertEquals(1, newBlock.getHeight()); -// -// LedgerTransaction tx1 = ledgerRepo.getTransactionSet() -// .get(transactionRequest1.getTransactionContent().getHash()); -// -// assertNotNull(tx1); -// assertEquals(TransactionState.SUCCESS, tx1.getExecutionState()); - } private HashDigest initLedger(MemoryKVStorage storage, BlockchainKeypair... partiKeys) { diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataVersionConflictException.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataVersionConflictException.java index 8af67d01..9831c0cc 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataVersionConflictException.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataVersionConflictException.java @@ -1,6 +1,6 @@ package com.jd.blockchain.ledger; -public class DataVersionConflictException extends BlockRollbackException { +public class DataVersionConflictException extends LedgerException { private static final long serialVersionUID = 3583192000738807503L;