Skip to content

Commit 9491090

Browse files
committed
there is not the most recent common ancestor, need to remove all blocks in the fork chain
1 parent 9afeb06 commit 9491090

File tree

2 files changed

+69
-3
lines changed

2 files changed

+69
-3
lines changed

src/main/java/org/tron/core/db/Manager.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -587,9 +587,23 @@ private void switchFork(BlockCapsule newHead)
587587
ValidateScheduleException, AccountResourceInsufficientException, TaposException,
588588
TooBigTransactionException, DupTransactionException, TransactionExpirationException,
589589
NonCommonBlockException {
590-
Pair<LinkedList<KhaosBlock>, LinkedList<KhaosBlock>> binaryTree =
591-
khaosDb.getBranch(
592-
newHead.getBlockId(), getDynamicPropertiesStore().getLatestBlockHeaderHash());
590+
new Pair<>(new LinkedList<>(), new LinkedList<>());
591+
Pair<LinkedList<KhaosBlock>, LinkedList<KhaosBlock>> binaryTree;
592+
try {
593+
binaryTree =
594+
khaosDb.getBranch(
595+
newHead.getBlockId(), getDynamicPropertiesStore().getLatestBlockHeaderHash());
596+
} catch (NonCommonBlockException e) {
597+
logger.info("there is not the most recent common ancestor, need to remove all blocks in the fork chain.");
598+
BlockCapsule tmp = newHead;
599+
while (tmp != null) {
600+
BlockCapsule parent = khaosDb.getParentBlock(tmp.getBlockId());
601+
khaosDb.removeBlk(tmp.getBlockId());
602+
tmp = parent;
603+
}
604+
605+
throw e;
606+
}
593607

594608
if (CollectionUtils.isNotEmpty(binaryTree.getValue())) {
595609
while (!getDynamicPropertiesStore()

src/test/java/org/tron/core/db/ManagerTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,10 @@ public void doNotSwitch()
312312
createTestBlockCapsule(
313313
num + 2, blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
314314

315+
logger.info("******block0:" + blockCapsule0);
316+
logger.info("******block1:" + blockCapsule1);
317+
logger.info("******block2:" + blockCapsule2);
318+
315319
dbManager.pushBlock(blockCapsule0);
316320
dbManager.pushBlock(blockCapsule1);
317321
context.getBean(KhaosDatabase.class).removeBlk(dbManager.getBlockIdByNum(num));
@@ -323,12 +327,38 @@ public void doNotSwitch()
323327
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule0.getBlockId().getBytes()));
324328
Assert.assertEquals(blockCapsule0.getBlockId(),
325329
dbManager.getBlockStore().get(blockCapsule0.getBlockId().getBytes()).getBlockId());
330+
Assert.assertEquals(blockCapsule0.getBlockId(),
331+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
326332
exception = e;
327333
}
328334

329335
if (exception == null) {
330336
throw new IllegalStateException();
331337
}
338+
339+
BlockCapsule blockCapsule3 =
340+
createTestBlockCapsule(
341+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
342+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(), addressToProvateKeys);
343+
logger.info("******block3:" + blockCapsule3);
344+
dbManager.pushBlock(blockCapsule3);
345+
346+
Assert.assertEquals(blockCapsule3.getBlockId(),
347+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
348+
Assert.assertEquals(blockCapsule3.getBlockId(),
349+
dbManager.getBlockStore().get(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getBytes()).getBlockId());
350+
351+
BlockCapsule blockCapsule4 =
352+
createTestBlockCapsule(
353+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
354+
blockCapsule3.getBlockId().getByteString(), addressToProvateKeys);
355+
logger.info("******block4:" + blockCapsule4);
356+
dbManager.pushBlock(blockCapsule4);
357+
358+
Assert.assertEquals(blockCapsule4.getBlockId(),
359+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
360+
Assert.assertEquals(blockCapsule4.getBlockId(),
361+
dbManager.getBlockStore().get(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getBytes()).getBlockId());
332362
}
333363

334364
@Test
@@ -380,6 +410,28 @@ public void switchBack()
380410
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule0.getBlockId().getBytes()));
381411
Assert.assertEquals(blockCapsule0.getBlockId(),
382412
dbManager.getBlockStore().get(blockCapsule0.getBlockId().getBytes()).getBlockId());
413+
414+
BlockCapsule blockCapsule3 =
415+
createTestBlockCapsule(
416+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
417+
blockCapsule0.getBlockId().getByteString(), addressToProvateKeys);
418+
dbManager.pushBlock(blockCapsule3);
419+
420+
Assert.assertEquals(blockCapsule3.getBlockId(),
421+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
422+
Assert.assertEquals(blockCapsule3.getBlockId(),
423+
dbManager.getBlockStore().get(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getBytes()).getBlockId());
424+
425+
BlockCapsule blockCapsule4 =
426+
createTestBlockCapsule(
427+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1,
428+
blockCapsule3.getBlockId().getByteString(), addressToProvateKeys);
429+
dbManager.pushBlock(blockCapsule4);
430+
431+
Assert.assertEquals(blockCapsule4.getBlockId(),
432+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
433+
Assert.assertEquals(blockCapsule4.getBlockId(),
434+
dbManager.getBlockStore().get(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getBytes()).getBlockId());
383435
}
384436

385437
private Map<ByteString, String> addTestWitnessAndAccount() {

0 commit comments

Comments
 (0)