> > > > > > > that my linked list allocation file-backed strategy
> > > > > > >
> > > > > > > is __full of bugs densely__
>
> > > > > > now i like bugs. all my life i loved insects! i was a nerdy
> > > > > > introvert
>
> > on to the software bugs
>
> here is i.py right now, i'm trying to kind of direct my logic turmoil
> to slowly improve it
>
> here is the current backtrace:
>
> File
> "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/pdb.py",
> line 1754, in _run
> self.run(target.code)
> File
> "/nix/store/f2krmq3iv5nibcvn4rw7nrnrciqprdkh-python3-3.12.9/lib/python3.12/bdb.py",
> line 627, in run
> exec(cmd, globals, locals)
> File "/home/karl3/projects/rep/rep/array.py", line 138, in <module>
> doc[:] = b''
> ~~~^^^
> File "/home/karl3/projects/rep/rep/array.py", line 111, in __setitem__
> dealloc(old_id)
> File "/home/karl3/projects/rep/rep/i.py", line 36, in dealloc
> self.fsck()
> File "/home/karl3/projects/rep/rep/i.py", line 114, in fsck
> assert l8 <= self.yq - addr8
>
> somehow it seems after a dealloc that the store became inconsistent.
>
> (Pdb) list
> 31 addr8 = memoryview(id).cast('Q')[0]
> 32 l8 = max((self.q[addr8]+self.idsize-1)//self.idsize,1) + 1
> 33 self.q[addr8] = self.q[0]
> 34 self.q[addr8+1] = l8
> 35 self.q[0] = addr8
> 36 -> self.fsck()
> 37 def alloc(self, data, replacing=[]):
> 38 self.fsck()
> 39 l8 = max((len(data)+self.idsize-1)//self.idsize,1) + 1
> 40 addr8 = 0
> 41 assert self.q[addr8] != 0
> (Pdb) p addr8
> 1
> (Pdb) p id
> b'\x01\x00\x00\x00\x00\x00\x00\x00'
> (Pdb) p self.q[addr8]
> 11
> (Pdb) p l8
> 4
> (Pdb) p addr8
> 1
> (Pdb) p l8
> 4
> (Pdb) p self.w[addr8*self.idsize:addr8+self.idsize+4*self.idsize]
> <memory at 0x7f0a3b9d9840>
> (Pdb) p self.w[addr8*self.idsize:addr8+self.idsize+4*self.idsize].tobytes()
> b'\x0b\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00k
> brown fox jum\x00\t'
>
> the 'k brown fox jum' content looks believable. additionally, the fsck
> prior to the deallocation passed [ :S ]
(Pdb) down
> /home/karl3/projects/rep/rep/i.py(114)fsck()
-> assert l8 <= self.yq - addr8
(Pdb) list
109 passed_regions.append(region)
110 assert region[1] <= self.yq - addr8
111 addr8 += region[1]
112 else:
113 l8 =
max((self.q[addr8]+self.idsize-1)//self.idsize,1) + 1
114 -> assert l8 <= self.yq - addr8
115 addr8 += l8
116 assert addr8 == self.yq
117 def shrink(self):
118 self.fsck()
119 unused = 0
(Pdb) p addr8
4
(Pdb) p self.q[addr8]
30809871133208422
(Pdb) p l8
3851233891651054
(Pdb) p regions
[[11, 501], [1, 4]]
(Pdb) p passed_regions
[]