1. 13 Nov, 2020 1 commit
  2. 03 Sep, 2020 2 commits
    • dirkmc's avatar
      00f4df8d
    • 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