Fix StoreStream so it doesn't return parity bytes (#838)
* fix storestream so it doesn\'t return parity bits for protected/verifiable manifests * use Cid.example instead of creating a mock manually
This commit is contained in:
parent
ec7faa21b5
commit
4619260dc1
|
@ -135,13 +135,6 @@ func isManifest*(mc: MultiCodec): ?!bool =
|
||||||
# Various sizes and verification
|
# Various sizes and verification
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
func bytes*(self: Manifest, pad = true): NBytes =
|
|
||||||
## Compute how many bytes corresponding StoreStream(Manifest, pad) will return
|
|
||||||
if pad or self.protected:
|
|
||||||
self.blocksCount.NBytes * self.blockSize
|
|
||||||
else:
|
|
||||||
self.datasetSize
|
|
||||||
|
|
||||||
func rounded*(self: Manifest): int =
|
func rounded*(self: Manifest): int =
|
||||||
## Number of data blocks in *protected* manifest including padding at the end
|
## Number of data blocks in *protected* manifest including padding at the end
|
||||||
roundUp(self.originalBlocksCount, self.ecK)
|
roundUp(self.originalBlocksCount, self.ecK)
|
||||||
|
|
|
@ -38,7 +38,6 @@ type
|
||||||
StoreStream* = ref object of SeekableStream
|
StoreStream* = ref object of SeekableStream
|
||||||
store*: BlockStore # Store where to lookup block contents
|
store*: BlockStore # Store where to lookup block contents
|
||||||
manifest*: Manifest # List of block CIDs
|
manifest*: Manifest # List of block CIDs
|
||||||
pad*: bool # Pad last block to manifest.blockSize?
|
|
||||||
|
|
||||||
method initStream*(s: StoreStream) =
|
method initStream*(s: StoreStream) =
|
||||||
if s.objName.len == 0:
|
if s.objName.len == 0:
|
||||||
|
@ -57,13 +56,15 @@ proc new*(
|
||||||
result = StoreStream(
|
result = StoreStream(
|
||||||
store: store,
|
store: store,
|
||||||
manifest: manifest,
|
manifest: manifest,
|
||||||
pad: pad,
|
|
||||||
offset: 0)
|
offset: 0)
|
||||||
|
|
||||||
result.initStream()
|
result.initStream()
|
||||||
|
|
||||||
method `size`*(self: StoreStream): int =
|
method `size`*(self: StoreStream): int =
|
||||||
bytes(self.manifest, self.pad).int
|
## The size of a StoreStream is the size of the original dataset, without
|
||||||
|
## padding or parity blocks.
|
||||||
|
let m = self.manifest
|
||||||
|
(if m.protected: m.originalDatasetSize else: m.datasetSize).int
|
||||||
|
|
||||||
proc `size=`*(self: StoreStream, size: int)
|
proc `size=`*(self: StoreStream, size: int)
|
||||||
{.error: "Setting the size is forbidden".} =
|
{.error: "Setting the size is forbidden".} =
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
import pkg/chronos
|
import pkg/chronos
|
||||||
import pkg/questionable/results
|
import pkg/questionable/results
|
||||||
|
|
||||||
import pkg/codex/streams
|
import pkg/codex/[
|
||||||
import pkg/codex/stores
|
streams,
|
||||||
import pkg/codex/manifest
|
stores,
|
||||||
import pkg/codex/blocktype as bt
|
indexingstrategy,
|
||||||
|
manifest,
|
||||||
|
blocktype as bt]
|
||||||
|
|
||||||
import ../asynctest
|
import ../asynctest
|
||||||
|
import ./examples
|
||||||
import ./helpers
|
import ./helpers
|
||||||
|
|
||||||
asyncchecksuite "StoreStream":
|
asyncchecksuite "StoreStream":
|
||||||
|
@ -99,3 +102,40 @@ asyncchecksuite "StoreStream":
|
||||||
|
|
||||||
await stream.readExactly(addr buf[0], 15)
|
await stream.readExactly(addr buf[0], 15)
|
||||||
check sequentialBytes(buf,15,0)
|
check sequentialBytes(buf,15,0)
|
||||||
|
|
||||||
|
suite "StoreStream - Size Tests":
|
||||||
|
|
||||||
|
var stream: StoreStream
|
||||||
|
|
||||||
|
teardown:
|
||||||
|
await stream.close()
|
||||||
|
|
||||||
|
test "Should return dataset size as stream size":
|
||||||
|
let manifest = Manifest.new(
|
||||||
|
treeCid = Cid.example,
|
||||||
|
datasetSize = 80.NBytes,
|
||||||
|
blockSize = 10.NBytes
|
||||||
|
)
|
||||||
|
|
||||||
|
stream = StoreStream.new(CacheStore.new(), manifest)
|
||||||
|
|
||||||
|
check stream.size == 80
|
||||||
|
|
||||||
|
test "Should not count parity/padding bytes as part of stream size":
|
||||||
|
let protectedManifest = Manifest.new(
|
||||||
|
treeCid = Cid.example,
|
||||||
|
datasetSize = 120.NBytes, # size including parity bytes
|
||||||
|
blockSize = 10.NBytes,
|
||||||
|
version = CIDv1,
|
||||||
|
hcodec = Sha256HashCodec,
|
||||||
|
codec = BlockCodec,
|
||||||
|
ecK = 2,
|
||||||
|
ecM = 1,
|
||||||
|
originalTreeCid = Cid.example,
|
||||||
|
originalDatasetSize = 80.NBytes, # size without parity bytes
|
||||||
|
strategy = StrategyType.SteppedStrategy
|
||||||
|
)
|
||||||
|
|
||||||
|
stream = StoreStream.new(CacheStore.new(), protectedManifest)
|
||||||
|
|
||||||
|
check stream.size == 80
|
||||||
|
|
Loading…
Reference in New Issue