mirror of
https://github.com/status-im/nim-dagger.git
synced 2025-02-28 06:10:45 +00:00
rework background downloads and prefetch
This commit is contained in:
parent
7aae901440
commit
1a2381c0f2
@ -213,6 +213,28 @@ proc fetchBatched*(
|
|||||||
let iter = Iter[int].new(0 ..< manifest.blocksCount)
|
let iter = Iter[int].new(0 ..< manifest.blocksCount)
|
||||||
self.fetchBatched(manifest.treeCid, iter, batchSize, onBatch, fetchLocal)
|
self.fetchBatched(manifest.treeCid, iter, batchSize, onBatch, fetchLocal)
|
||||||
|
|
||||||
|
proc fetchDatasetAsync*(
|
||||||
|
self: CodexNodeRef, manifest: Manifest, fetchLocal = true
|
||||||
|
): Future[void] {.async: (raises: []).} =
|
||||||
|
## Asynchronously fetch a dataset in the background.
|
||||||
|
## This task will be tracked and cleaned up on node shutdown.
|
||||||
|
##
|
||||||
|
try:
|
||||||
|
if err =? (
|
||||||
|
await self.fetchBatched(
|
||||||
|
manifest = manifest, batchSize = DefaultFetchBatch, fetchLocal = fetchLocal
|
||||||
|
)
|
||||||
|
).errorOption:
|
||||||
|
error "Unable to fetch blocks", err = err.msg
|
||||||
|
except CatchableError as exc:
|
||||||
|
error "Error fetching blocks", exc = exc.msg
|
||||||
|
|
||||||
|
proc fetchDatasetAsyncTask*(self: CodexNodeRef, manifest: Manifest) =
|
||||||
|
## Start fetching a dataset in the background.
|
||||||
|
## The task will be tracked and cleaned up on node shutdown.
|
||||||
|
##
|
||||||
|
self.trackedFutures.track(self.fetchDatasetAsync(manifest, fetchLocal = false))
|
||||||
|
|
||||||
proc streamSingleBlock(self: CodexNodeRef, cid: Cid): Future[?!LPStream] {.async.} =
|
proc streamSingleBlock(self: CodexNodeRef, cid: Cid): Future[?!LPStream] {.async.} =
|
||||||
## Streams the contents of a single block.
|
## Streams the contents of a single block.
|
||||||
##
|
##
|
||||||
@ -256,16 +278,8 @@ proc streamEntireDataset(
|
|||||||
|
|
||||||
self.trackedFutures.track(erasureJob())
|
self.trackedFutures.track(erasureJob())
|
||||||
|
|
||||||
proc prefetch() {.async: (raises: []).} =
|
self.trackedFutures.track(self.fetchDatasetAsync(manifest, fetchLocal = false))
|
||||||
try:
|
# prefetch task should not fetch from local store
|
||||||
if err =? (
|
|
||||||
await self.fetchBatched(manifest, DefaultFetchBatch, fetchLocal = false)
|
|
||||||
).errorOption:
|
|
||||||
error "Unable to fetch blocks", err = err.msg
|
|
||||||
except CatchableError as exc:
|
|
||||||
error "Error fetching blocks", exc = exc.msg
|
|
||||||
|
|
||||||
self.trackedFutures.track(prefetch())
|
|
||||||
|
|
||||||
# Retrieve all blocks of the dataset sequentially from the local store or network
|
# Retrieve all blocks of the dataset sequentially from the local store or network
|
||||||
trace "Creating store stream for manifest", manifestCid
|
trace "Creating store stream for manifest", manifestCid
|
||||||
|
@ -299,15 +299,8 @@ proc initDataApi(node: CodexNodeRef, repoStore: RepoStore, router: var RestRoute
|
|||||||
error "Failed to fetch manifest", err = err.msg
|
error "Failed to fetch manifest", err = err.msg
|
||||||
return RestApiResponse.error(Http404, err.msg, headers = headers)
|
return RestApiResponse.error(Http404, err.msg, headers = headers)
|
||||||
|
|
||||||
proc fetchDatasetAsync(): Future[void] {.async.} =
|
# Start fetching the dataset in the background
|
||||||
try:
|
node.fetchDatasetAsyncTask(manifest)
|
||||||
if err =? (await node.fetchBatched(manifest)).errorOption:
|
|
||||||
error "Unable to fetch dataset", cid = cid.get(), err = err.msg
|
|
||||||
except CatchableError as exc:
|
|
||||||
error "CatchableError when fetching dataset", cid = cid.get(), exc = exc.msg
|
|
||||||
discard
|
|
||||||
|
|
||||||
asyncSpawn fetchDatasetAsync()
|
|
||||||
|
|
||||||
let json = %formatManifest(cid.get(), manifest)
|
let json = %formatManifest(cid.get(), manifest)
|
||||||
return RestApiResponse.response($json, contentType = "application/json")
|
return RestApiResponse.response($json, contentType = "application/json")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user