Pad B*-tree files to the alloc block size

This bug was corrupting all volumes over 32 MB (i.e. with a block size
exceeding 512 bytes). Oops!
This commit is contained in:
Elliot Nunn 2018-10-14 10:08:44 +08:00
parent 925fd13cd3
commit 829d3a5189
2 changed files with 9 additions and 4 deletions

View File

@ -103,7 +103,9 @@ def dump_btree(buf):
this_leaf = ndFLink
def make_btree(records, bthKeyLen):
def make_btree(records, bthKeyLen, blksize):
nodemult = blksize // 512
nodelist = [] # append to this as we go
# pointers per index node, range 2-11
@ -156,7 +158,7 @@ def make_btree(records, bthKeyLen):
# Add map nodes with 3952-bit bitmap recs to cover every node
bits_covered = 2048
mapnodes = []
while bits_covered < len(nodelist):
while bits_covered < bitmanip.pad_up(len(nodelist), nodemult):
mapnode = _Node(ndType=2, ndNHeight=1)
nodelist.append(mapnode)
mapnodes.append(mapnode)
@ -188,4 +190,7 @@ def make_btree(records, bthKeyLen):
bthDepth, bthRoot, bthNRecs, bthFNode, bthLNode,
bthNodeSize, bthKeyLen, bthNNodes, bthFree)
slop_nodes = bitmanip.pad_up(len(nodelist), nodemult) - len(nodelist)
nodelist.append(512 * slop_nodes)
return b''.join(bytes(node) for node in nodelist)

View File

@ -243,7 +243,7 @@ class Volume(directory.AbstractFolder):
blkaccum = []
# <<< put the empty extents overflow file in here >>>
extoflowfile = btree.make_btree([], bthKeyLen=7)
extoflowfile = btree.make_btree([], bthKeyLen=7, blksize=drAlBlkSiz)
# also need to do some cleverness to ensure that this gets picked up...
drXTFlSize = len(extoflowfile)
drXTExtRec_Start = len(blkaccum)
@ -344,7 +344,7 @@ class Volume(directory.AbstractFolder):
# now it is time to sort these records! fuck that shit...
catalog.sort(key=_catalog_rec_sort)
catalogfile = btree.make_btree(catalog, bthKeyLen=37)
catalogfile = btree.make_btree(catalog, bthKeyLen=37, blksize=drAlBlkSiz)
# also need to do some cleverness to ensure that this gets picked up...
drCTFlSize = len(catalogfile)
drCTExtRec_Start = len(blkaccum)