116 lines
3.4 KiB
Nim
116 lines
3.4 KiB
Nim
|
# Nimbus
|
||
|
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
||
|
# Licensed and distributed under either of
|
||
|
# * MIT license (license terms in the root directory or at
|
||
|
# https://opensource.org/licenses/MIT).
|
||
|
# * Apache v2 license (license terms in the root directory or at
|
||
|
# https://www.apache.org/licenses/LICENSE-2.0).
|
||
|
# at your option. This file may not be copied, modified, or distributed
|
||
|
# except according to those terms.
|
||
|
|
||
|
{.push raises:[].}
|
||
|
|
||
|
import
|
||
|
pkg/eth/p2p,
|
||
|
pkg/results,
|
||
|
pkg/stew/interval_set,
|
||
|
../worker_desc
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Public functions
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
proc blocksUnprocFetch*(
|
||
|
ctx: FlareCtxRef;
|
||
|
maxLen: uint64;
|
||
|
): Result[BnRange,void] =
|
||
|
## Fetch interval from block ranges with maximal size `maxLen`, where
|
||
|
## `0` is interpreted as `2^64`.
|
||
|
##
|
||
|
let
|
||
|
q = ctx.blk.unprocessed
|
||
|
|
||
|
# Fetch bottom/left interval with least block numbers
|
||
|
jv = q.ge().valueOr:
|
||
|
return err()
|
||
|
|
||
|
# Curb interval to maximal length `maxLen`
|
||
|
iv = block:
|
||
|
if maxLen == 0 or (0 < jv.len and jv.len <= maxLen):
|
||
|
jv
|
||
|
else:
|
||
|
# Curb interval `jv` to length `maxLen`
|
||
|
#
|
||
|
# Note that either (fringe case):
|
||
|
# (`jv.len`==0) => (`jv`==`[0,high(u64)]`) => `jv.maxPt`==`high(u64)`
|
||
|
# or (in the non-fringe case)
|
||
|
# (`maxLen` < `jv.len`) => (`jv.minPt` + `maxLen` - 1 < `jv.maxPt`)
|
||
|
#
|
||
|
BnRange.new(jv.minPt, jv.minPt + maxLen - 1)
|
||
|
|
||
|
discard q.reduce(iv)
|
||
|
ctx.blk.borrowed += iv.len
|
||
|
ok(iv)
|
||
|
|
||
|
|
||
|
proc blocksUnprocCommit*(ctx: FlareCtxRef; borrowed: uint) =
|
||
|
## Commit back all processed range
|
||
|
ctx.blk.borrowed -= borrowed
|
||
|
|
||
|
proc blocksUnprocCommit*(ctx: FlareCtxRef; borrowed: uint; retuor: BnRange) =
|
||
|
## Merge back unprocessed range `retour`
|
||
|
ctx.blocksUnprocCommit borrowed
|
||
|
doAssert ctx.blk.unprocessed.merge(retuor) == retuor.len
|
||
|
|
||
|
proc blocksUnprocCommit*(
|
||
|
ctx: FlareCtxRef;
|
||
|
borrowed: uint;
|
||
|
rMinPt: BlockNumber;
|
||
|
rMaxPt: BlockNumber) =
|
||
|
## Variant of `blocksUnprocCommit()`
|
||
|
ctx.blocksUnprocCommit borrowed
|
||
|
doAssert ctx.blk.unprocessed.merge(rMinPt, rMaxPt) == rMaxPt - rMinPt + 1
|
||
|
|
||
|
|
||
|
proc blocksUnprocCovered*(ctx: FlareCtxRef; minPt,maxPt: BlockNumber): uint64 =
|
||
|
## Check whether range is fully contained
|
||
|
ctx.blk.unprocessed.covered(minPt, maxPt)
|
||
|
|
||
|
proc blocksUnprocCovered*(ctx: FlareCtxRef; pt: BlockNumber): bool =
|
||
|
## Check whether point is contained
|
||
|
ctx.blk.unprocessed.covered(pt, pt) == 1
|
||
|
|
||
|
|
||
|
proc blocksUnprocTop*(ctx: FlareCtxRef): BlockNumber =
|
||
|
let iv = ctx.blk.unprocessed.le().valueOr:
|
||
|
return BlockNumber(0)
|
||
|
iv.maxPt
|
||
|
|
||
|
proc blocksUnprocBottom*(ctx: FlareCtxRef): BlockNumber =
|
||
|
let iv = ctx.blk.unprocessed.ge().valueOr:
|
||
|
return high(BlockNumber)
|
||
|
iv.minPt
|
||
|
|
||
|
|
||
|
proc blocksUnprocTotal*(ctx: FlareCtxRef): uint64 =
|
||
|
ctx.blk.unprocessed.total()
|
||
|
|
||
|
proc blocksUnprocBorrowed*(ctx: FlareCtxRef): uint64 =
|
||
|
ctx.blk.borrowed
|
||
|
|
||
|
proc blocksUnprocChunks*(ctx: FlareCtxRef): int =
|
||
|
ctx.blk.unprocessed.chunks()
|
||
|
|
||
|
proc blocksUnprocIsEmpty*(ctx: FlareCtxRef): bool =
|
||
|
ctx.blk.unprocessed.chunks() == 0
|
||
|
|
||
|
# ------------------
|
||
|
|
||
|
proc blocksUnprocInit*(ctx: FlareCtxRef) =
|
||
|
## Constructor
|
||
|
ctx.blk.unprocessed = BnRangeSet.init()
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# End
|
||
|
# ------------------------------------------------------------------------------
|