• Paul Wolneykien's avatar
    Added `WithScoreLedger` Bitswap option (#430) · fd213932
    Paul Wolneykien authored
    * Separate decision engine ledger on two parts: score and the wantlist
    
    This is the first step to make external decision logic (tagging
    peers with score values) possible.
    
    The wantlist still resides in the original `ledger` struct while
    sent/received byte accounting and scores are extracted to the new
    `scoreledger` struct managed by the original `scoreWorker()` logic.
    The accounting is integrated into the `Engine` via `ScoreLedger`
    interface making it possible to replace the original `scoreWorker()`
    with some other logic. The interface, however, doesn't allow a
    score logic to directly touch peer tags: the logic may decide about
    score values while tagging itself is still under control of Engine.
    
    Note: with this commit it's yet not possible to replace the original
    score logic because there is no public methods for that.
    
    * Added "WithScoreLedger" Bitswap option
    
    New `WithScoreLedger(decision.ScoreLedger)` option in the `bitswap`
    package is the way to connect a custom `ScoreLedger` implementation
    to the decision engine. The `Engine` now has the corresponding
    `UseScoreLedger(ScoreLedger)` method.
    
    The `ScoreLedger` and `ScorePeerFunc` types are exposed from the
    internal `decision` package to the public one.
    
    Because its options are processed by the `Bitswap` after construction
    of its parts but before starting of the engine, the default
    `scoreLedger` initialization is moved from `newEngine()` to
    `StartWorkers()`.
    
    New `TestWithScoreLedger` test is added. The test checks for start and
    stop of the testing score ledger implementation that is specified via
    `WithScoreLedger` option.
    
    * Combine score ledger start with initialization of the score function
    
    Having a separate `Init(ScoreFunc)` method seems redundant (thx
    @dirkmc for pointing about that). As a bonus, the two-step ledger
    starting process is now enclosed in the `startScoreLedger()` function.
    
    * Let's call Stop() to stop a ScoreLedger
    
    The `Close()` method was there to stop the ledger. Let call it
    `Stop()` now.
    
    * Get return of the blank Receipt out of conditional block
    
    Explicitly form it as the final resort.
    Co-authored-by: default avatarPaul Wolneykien <manowar@altlinux.org>
    fd213932
bitswap.go 17.3 KB