mirror of
https://github.com/status-im/nim-codex.git
synced 2025-02-26 17:30:50 +00:00
* adding basic retry functionality * avoid duplicate requests and batch them * fix cancelling blocks * properly resolve blocks * minor cleanup - use `self` * avoid useless asyncSpawn * track retries * limit max inflight and set libp2p maxIncomingStreams * cleanup * add basic yield in readLoop * use tuple instead of object * cleanup imports and logs * increase defaults * wip * fix prefetch batching * cleanup * decrease timeouts to speedup tests * remove outdated test * add retry tests * should track retries * remove useless test * use correct block address (index was off by 1) * remove duplicate noop proc * add BlockHandle type * Use BlockHandle type * add fetchLocal to control batching from local store * add format target * revert deps * adjust quotaMaxBytes * cleanup imports and logs * revert deps * cleanup blocks on cancelled * terminate erasure and prefetch jobs on stream end * split storing and retrieving data into separate tests * track `b.discoveryLoop` future * misc * remove useless check
71 lines
1.8 KiB
Nim
71 lines
1.8 KiB
Nim
## Nim-Codex
|
|
## Copyright (c) 2021 Status Research & Development GmbH
|
|
## Licensed under either of
|
|
## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
## * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
## at your option.
|
|
## This file may not be copied, modified, or distributed except according to
|
|
## those terms.
|
|
|
|
import pkg/upraises
|
|
|
|
push:
|
|
{.upraises: [].}
|
|
|
|
import pkg/libp2p/crypto/crypto
|
|
import pkg/bearssl/rand
|
|
|
|
type
|
|
RngSampleError = object of CatchableError
|
|
Rng* = ref HmacDrbgContext
|
|
|
|
var rng {.threadvar.}: Rng
|
|
|
|
proc instance*(t: type Rng): Rng =
|
|
if rng.isNil:
|
|
rng = newRng()
|
|
rng
|
|
|
|
# Random helpers: similar as in stdlib, but with HmacDrbgContext rng
|
|
# TODO: Move these somewhere else?
|
|
const randMax = 18_446_744_073_709_551_615'u64
|
|
|
|
proc rand*(rng: Rng, max: Natural): int =
|
|
if max == 0:
|
|
return 0
|
|
|
|
while true:
|
|
let x = rng[].generate(uint64)
|
|
if x < randMax - (randMax mod (uint64(max) + 1'u64)): # against modulo bias
|
|
return int(x mod (uint64(max) + 1'u64))
|
|
|
|
proc sample*[T](rng: Rng, a: openArray[T]): T =
|
|
result = a[rng.rand(a.high)]
|
|
|
|
proc sample*[T](
|
|
rng: Rng, sample, exclude: openArray[T]
|
|
): T {.raises: [Defect, RngSampleError].} =
|
|
if sample == exclude:
|
|
raise newException(RngSampleError, "Sample and exclude arrays are the same!")
|
|
|
|
while true:
|
|
result = rng.sample(sample)
|
|
if exclude.find(result) != -1:
|
|
continue
|
|
|
|
break
|
|
|
|
proc sample*[T](
|
|
rng: Rng, sample: openArray[T], limit: int
|
|
): seq[T] {.raises: [Defect, RngSampleError].} =
|
|
if limit > sample.len:
|
|
raise newException(RngSampleError, "Limit cannot be larger than sample!")
|
|
|
|
for _ in 0 ..< min(sample.len, limit):
|
|
result.add(rng.sample(sample, result))
|
|
|
|
proc shuffle*[T](rng: Rng, a: var openArray[T]) =
|
|
for i in countdown(a.high, 1):
|
|
let j = rng.rand(i)
|
|
swap(a[i], a[j])
|