era: speed up index reading (#6305)
This commit is contained in:
parent
708b23f084
commit
e0f8ea752b
34
ncli/era.nim
34
ncli/era.nim
|
@ -92,41 +92,43 @@ proc appendRecord(f: IoHandle, index: Index): Result[int64, string] =
|
|||
f.appendIndex(index.startSlot, index.offsets)
|
||||
|
||||
proc readIndex*(f: IoHandle): Result[Index, string] =
|
||||
var
|
||||
buf: seq[byte]
|
||||
pos: int
|
||||
|
||||
let
|
||||
startPos = ? f.getFilePos().mapErr(toString)
|
||||
fileSize = ? f.getFileSize().mapErr(toString)
|
||||
header = ? f.readHeader()
|
||||
header = ? f.readRecord(buf)
|
||||
|
||||
if header.typ != E2Index: return err("not an index")
|
||||
if header.len < 16: return err("index entry too small")
|
||||
if header.len mod 8 != 0: return err("index length invalid")
|
||||
if buf.len < 16: return err("index entry too small")
|
||||
if buf.len mod 8 != 0: return err("index length invalid")
|
||||
|
||||
var buf: array[8, byte]
|
||||
? f.readFileExact(buf)
|
||||
let
|
||||
slot = uint64.fromBytesLE(buf)
|
||||
count = header.len div 8 - 2
|
||||
slot = uint64.fromBytesLE(buf.toOpenArray(pos, pos + 7))
|
||||
count = buf.len div 8 - 2
|
||||
pos += 8
|
||||
|
||||
# technically not an error, but we'll throw this sanity check in here..
|
||||
if slot > int32.high().uint64: return err("fishy slot")
|
||||
|
||||
var offsets = newSeqUninitialized[int64](count)
|
||||
for i in 0..<count:
|
||||
? f.readFileExact(buf)
|
||||
|
||||
let
|
||||
offset = uint64.fromBytesLE(buf)
|
||||
offset = uint64.fromBytesLE(buf.toOpenArray(pos, pos + 7))
|
||||
absolute =
|
||||
if offset == 0: 0'i64
|
||||
else:
|
||||
# Wrapping math is actually convenient here
|
||||
cast[int64](cast[uint64](startPos) + offset)
|
||||
|
||||
if absolute < 0 or absolute > fileSize: return err("Invalid offset")
|
||||
if absolute < 0 or absolute > fileSize: return err("invalid offset")
|
||||
offsets[i] = absolute
|
||||
pos += 8
|
||||
|
||||
? f.readFileExact(buf)
|
||||
if uint64(count) != uint64.fromBytesLE(buf): return err("invalid count")
|
||||
|
||||
# technically not an error, but we'll throw this sanity check in here..
|
||||
if slot > int32.high().uint64: return err("fishy slot")
|
||||
if uint64(count) != uint64.fromBytesLE(buf.toOpenArray(pos, pos + 7)):
|
||||
return err("invalid count")
|
||||
|
||||
ok(Index(startSlot: Slot(slot), offsets: offsets))
|
||||
|
||||
|
|
Loading…
Reference in New Issue