aboutsummaryrefslogtreecommitdiffstats
path: root/core/lattice.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/lattice.go')
-rw-r--r--core/lattice.go65
1 files changed, 37 insertions, 28 deletions
diff --git a/core/lattice.go b/core/lattice.go
index 2b1555d..b30306a 100644
--- a/core/lattice.go
+++ b/core/lattice.go
@@ -245,26 +245,27 @@ func (l *Lattice) ProcessBlock(
toDelivered []*types.Block
deliveredMode uint32
)
-
l.lock.Lock()
defer l.lock.Unlock()
-
if inLattice, err = l.addBlockToLattice(input); err != nil {
return
}
-
if len(inLattice) == 0 {
return
}
-
for _, b = range inLattice {
- toDelivered, deliveredMode, err = l.toModule.processBlock(b)
- if err != nil {
+ if err = l.toModule.addBlock(b); err != nil {
// All errors from total ordering is serious, should panic.
panic(err)
}
+ }
+ for {
+ toDelivered, deliveredMode, err = l.toModule.extractBlocks()
+ if err != nil {
+ panic(err)
+ }
if len(toDelivered) == 0 {
- continue
+ break
}
hashes := make(common.Hashes, len(toDelivered))
for idx := range toDelivered {
@@ -275,7 +276,7 @@ func (l *Lattice) ProcessBlock(
}
// Perform consensus timestamp module.
if err = l.ctModule.processBlocks(toDelivered); err != nil {
- return
+ break
}
delivered = append(delivered, toDelivered...)
}
@@ -317,32 +318,40 @@ func (l *Lattice) AppendConfig(round uint64, config *types.Config) (err error) {
}
// ProcessFinalizedBlock is used for syncing lattice data.
-func (l *Lattice) ProcessFinalizedBlock(b *types.Block) ([]*types.Block, error) {
+func (l *Lattice) ProcessFinalizedBlock(
+ b *types.Block) (delivered []*types.Block, err error) {
+ var (
+ toDelivered []*types.Block
+ deliveredMode uint32
+ )
l.lock.Lock()
defer l.lock.Unlock()
// Syncing state for core.latticeData module.
- if err := l.data.addFinalizedBlock(b); err != nil {
- return nil, err
+ if err = l.data.addFinalizedBlock(b); err != nil {
+ return
}
l.pool.purgeBlocks(b.Position.ChainID, b.Position.Height)
// Syncing state for core.totalOrdering module.
- toDelivered, deliveredMode, err := l.toModule.processBlock(b)
- if err != nil {
- return nil, err
- }
- if len(toDelivered) == 0 {
- return nil, nil
- }
- hashes := make(common.Hashes, len(toDelivered))
- for idx := range toDelivered {
- hashes[idx] = toDelivered[idx].Hash
- }
- if l.debug != nil {
- l.debug.TotalOrderingDelivered(hashes, deliveredMode)
+ if err = l.toModule.addBlock(b); err != nil {
+ return
}
- // Sync core.consensusTimestamp module.
- if err = l.ctModule.processBlocks(toDelivered); err != nil {
- return nil, err
+ for {
+ toDelivered, deliveredMode, err = l.toModule.extractBlocks()
+ if err != nil || len(toDelivered) == 0 {
+ break
+ }
+ hashes := make(common.Hashes, len(toDelivered))
+ for idx := range toDelivered {
+ hashes[idx] = toDelivered[idx].Hash
+ }
+ if l.debug != nil {
+ l.debug.TotalOrderingDelivered(hashes, deliveredMode)
+ }
+ // Sync core.consensusTimestamp module.
+ if err = l.ctModule.processBlocks(toDelivered); err != nil {
+ break
+ }
+ delivered = append(delivered, toDelivered...)
}
- return toDelivered, nil
+ return
}