1010import java .util .List ;
1111import java .util .Map ;
1212import java .util .Objects ;
13+ import java .util .stream .Collectors ;
1314import java .util .stream .Stream ;
1415import javafx .util .Pair ;
1516import lombok .Getter ;
2122import org .tron .core .capsule .BlockCapsule ;
2223import org .tron .core .capsule .BlockCapsule .BlockId ;
2324import org .tron .core .exception .BadNumberBlockException ;
25+ import org .tron .core .exception .NonCommonBlockException ;
2426import org .tron .core .exception .UnLinkedBlockException ;
2527
2628@ Component
2729public class KhaosDatabase extends TronDatabase {
2830
29- private class KhaosBlock {
31+ public static class KhaosBlock {
3032
3133 public Sha256Hash getParentHash () {
3234 return this .blk .getParentHash ();
@@ -38,6 +40,7 @@ public KhaosBlock(BlockCapsule blk) {
3840 this .num = blk .getNum ();
3941 }
4042
43+ @ Getter
4144 BlockCapsule blk ;
4245 Reference <KhaosBlock > parent = new WeakReference <>(null );
4346 BlockId id ;
@@ -82,10 +85,16 @@ public class KhaosStore {
8285
8386 @ Override
8487 protected boolean removeEldestEntry (Map .Entry <Long , ArrayList <KhaosBlock >> entry ) {
85- if (entry .getKey () < Long .max (0L , head .num - maxCapcity )) {
86- entry .getValue ().forEach (b -> hashKblkMap .remove (b .id ));
87- return true ;
88- }
88+ long minNum = Long .max (0L , head .num - maxCapcity );
89+ Map <Long , ArrayList <KhaosBlock >> minNumMap = numKblkMap .entrySet ().stream ()
90+ .filter (e -> e .getKey () < minNum )
91+ .collect (Collectors .toMap (Map .Entry ::getKey , Map .Entry ::getValue ));
92+
93+ minNumMap .forEach ((k , v ) -> {
94+ numKblkMap .remove (k );
95+ v .forEach (b -> hashKblkMap .remove (b .id ));
96+ });
97+
8998 return false ;
9099 }
91100 };
@@ -260,33 +269,48 @@ public void setMaxSize(int maxSize) {
260269 /**
261270 * Find two block's most recent common parent block.
262271 */
263- public Pair <LinkedList <BlockCapsule >, LinkedList <BlockCapsule >> getBranch (
264- Sha256Hash block1 , Sha256Hash block2 ) {
265- LinkedList <BlockCapsule > list1 = new LinkedList <>();
266- LinkedList <BlockCapsule > list2 = new LinkedList <>();
272+ public Pair <LinkedList <KhaosBlock >, LinkedList <KhaosBlock >> getBranch (Sha256Hash block1 , Sha256Hash block2 )
273+ throws NonCommonBlockException {
274+ LinkedList <KhaosBlock > list1 = new LinkedList <>();
275+ LinkedList <KhaosBlock > list2 = new LinkedList <>();
267276 KhaosBlock kblk1 = miniStore .getByHash (block1 );
277+ checkNull (kblk1 );
268278 KhaosBlock kblk2 = miniStore .getByHash (block2 );
279+ checkNull (kblk2 );
269280
270- if (kblk1 != null && kblk2 != null ) {
271- while (!Objects .equals (kblk1 , kblk2 )) {
272- if (kblk1 .num > kblk2 .num ) {
273- list1 .add (kblk1 .blk );
274- kblk1 = kblk1 .getParent ();
275- } else if (kblk1 .num < kblk2 .num ) {
276- list2 .add (kblk2 .blk );
277- kblk2 = kblk2 .getParent ();
278- } else {
279- list1 .add (kblk1 .blk );
280- list2 .add (kblk2 .blk );
281- kblk1 = kblk1 .getParent ();
282- kblk2 = kblk2 .getParent ();
283- }
284- }
281+ while (kblk1 .num > kblk2 .num ) {
282+ list1 .add (kblk1 );
283+ kblk1 = kblk1 .getParent ();
284+ checkNull (kblk1 );
285+ checkNull (miniStore .getByHash (kblk1 .id ));
286+ }
287+
288+ while (kblk2 .num > kblk1 .num ) {
289+ list2 .add (kblk2 );
290+ kblk2 = kblk2 .getParent ();
291+ checkNull (kblk2 );
292+ checkNull (miniStore .getByHash (kblk2 .id ));
293+ }
294+
295+ while (!Objects .equals (kblk1 , kblk2 )) {
296+ list1 .add (kblk1 );
297+ list2 .add (kblk2 );
298+ kblk1 = kblk1 .getParent ();
299+ checkNull (kblk1 );
300+ checkNull (miniStore .getByHash (kblk1 .id ));
301+ kblk2 = kblk2 .getParent ();
302+ checkNull (kblk2 );
303+ checkNull (miniStore .getByHash (kblk2 .id ));
285304 }
286305
287306 return new Pair <>(list1 , list2 );
288307 }
289308
309+ private void checkNull (Object o ) throws NonCommonBlockException {
310+ if (o == null ) {
311+ throw new NonCommonBlockException ();
312+ }
313+ }
290314 /**
291315 * Find two block's most recent common parent block.
292316 */
0 commit comments