Browse Source

fix DataVersionConflictException bug

tags/1.1.2^2^2
liuyuanmu 5 years ago
parent
commit
a258a8693f
4 changed files with 10 additions and 30 deletions
  1. +0
    -4
      source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java
  2. +2
    -3
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java
  3. +7
    -22
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java
  4. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataVersionConflictException.java

+ 0
- 4
source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java View File

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


+ 2
- 3
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/TransactionBatchProcessor.java View File

@@ -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(


+ 7
- 22
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/TransactionBatchProcessorTest.java View File

@@ -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) {


+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/DataVersionConflictException.java View File

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


Loading…
Cancel
Save