Turns out there were two problems in the Exchange class that contributed to this bug, making diagnosis somewhat difficult.
This branch fixes both:
(a) There is no longer a concept of "deferred reindexing" in raw_removeKeyRangeInternal. That was a relic of the fix-length write ahead journal of the past. One of the bug mechanisms used that code path to reinsert a page pointer to a page that had changed due to releasing all locks.
(b) there was a code path that failed to bump the tree generation counter upon completing a structure delete.
To support diagnosing this bug, I added better formatting and a new, useful CLI command that walks a pointer chain and displays selected information about a page. Some of these changes are located in Buffer#toStringDetail which is now simpler and more useful.
Also, while diagnosing this bug I came across Exceptions while reporting garbage chain structure errors in IntegrityCheck. Fixed that problem and wrote a unit test to verify it.
And of course the Eclipse random line-length formatter made its usual contribution...
Turns out there were two problems in the Exchange class that contributed to this bug, making diagnosis somewhat difficult.
This branch fixes both:
(a) There is no longer a concept of "deferred reindexing" in raw_removeKeyRa ngeInternal. That was a relic of the fix-length write ahead journal of the past. One of the bug mechanisms used that code path to reinsert a page pointer to a page that had changed due to releasing all locks.
(b) there was a code path that failed to bump the tree generation counter upon completing a structure delete.
To support diagnosing this bug, I added better formatting and a new, useful CLI command that walks a pointer chain and displays selected information about a page. Some of these changes are located in Buffer# toStringDetail which is now simpler and more useful.
Also, while diagnosing this bug I came across Exceptions while reporting garbage chain structure errors in IntegrityCheck. Fixed that problem and wrote a unit test to verify it.
And of course the Eclipse random line-length formatter made its usual contribution...