encoding: adding mult-dimensional encoding API

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
Csaba Kiraly 2023-11-16 11:52:02 +01:00
parent cc3ae92238
commit a7ad30f49a
No known key found for this signature in database
GPG Key ID: 0FE274EE8C95166E
3 changed files with 77 additions and 0 deletions

View File

@ -385,6 +385,25 @@ proc encode*(
return success encodedManifest
proc encodeMulti*(
self: Erasure,
manifest: Manifest,
code: seq[(int,int)]): Future[?!Manifest] {.async.} =
## Encode a manifest into one that is erasure protected in multiple dimensions.
##
## code: list of (K,M) RS code parameter pairs
var
mfest = manifest
i = 1
for (k,m) in code:
mfest = (await self.encode(mfest, k, m, i)).tryGet()
i *= (k+m)
return success mfest
proc decode*(
self: Erasure,
encoded: Manifest
@ -495,6 +514,26 @@ proc decode*(
return decoded.success
proc decodeMulti*(
self: Erasure,
encoded: Manifest
): Future[?!Manifest] {.async.} =
## Decode a protected manifest into it's original unprotected
## manifest
##
## `encoded` - the encoded (protected) manifest to
## be recovered
##
var
mfest = encoded
while mfest.protected:
mfest = (await self.decode(mfest)).tryGet()
return success mfest
proc start*(self: Erasure) {.async.} =
return

View File

@ -85,6 +85,11 @@ proc originalTreeCid*(self: Manifest): Cid =
proc originalBlocksCount*(self: Manifest): int =
divUp(self.originalManifest.datasetSize.int, self.blockSize.int)
proc unprotectedBlocksCount*(self: Manifest): int =
var mfest = self
while mfest.protected:
mfest = mfest.originalManifest
divUp(mfest.datasetSize.int, self.blockSize.int)
proc originalDatasetSize*(self: Manifest): NBytes =
self.originalDatasetSize

View File

@ -356,3 +356,36 @@ asyncchecksuite "Erasure encode/decode":
for d in dropped:
let present = await store.hasBlock(manifest.treeCid, d)
check present.tryGet()
test "3D encode: test multi-dimensional API":
const
encoding = @[(7, 3),(5, 2),(3, 1)]
let
encoded = (await erasure.encodeMulti(manifest, encoding)).tryGet()
decoded = (await erasure.decodeMulti(encoded)).tryGet()
check:
decoded.treeCid == manifest.treeCid
decoded.blocksCount == encoded.unprotectedBlocksCount
test "3D encode: test multi-dimensional API with drop":
const
encoding = @[(7, 3),(5, 2),(3, 1)]
let encoded = (await erasure.encodeMulti(manifest, encoding)).tryGet()
var
idx = rng.rand(encoded.steps - 1) # random row
dropped: seq[int]
for _ in 0..<encoded.ecM:
dropped.add(idx)
(await store.delBlock(encoded.treeCid, idx)).tryGet()
idx.inc(encoded.interleave)
let decoded = (await erasure.decodeMulti(encoded)).tryGet()
check:
decoded.treeCid == manifest.treeCid
decoded.blocksCount == encoded.unprotectedBlocksCount