Tom Lane wrote:
Heikki Linnakangas <[EMAIL PROTECTED]> writes:
To see what's going on, I added some logs to the split code to print out
the free space on both halves as calculated by findsplitloc, and the
actual free space on the pages after split. I'm seeing a discrepancy of
4 bytes on the right half; actual space free on right page after split
is 4 bytes less than anticipated.
Hm, mis-counting the positions of itempointers maybe?
Found it:
/* Count up total space in data items without actually scanning 'em */
dataitemtotal = rightspace - (int) PageGetFreeSpace(page);
This is 4 bytes off, because PageGetFreeSpace subtracts
sizeof(ItemIdData) from the actual free space on page. We could do
dataitemtotal = rightspace - ((int) PageGetFreeSpace(page)
+sizeof(ItemIdData));
but that again would be 4 bytes off in the other direction if there's 0
bytes left on the page :(.
IMHO the right fix is to modify PageGetFreeSpace not to do the
subtraction, it's a hack anyway, but that means we have to go through
and fix every caller of it. Or we can add a new PageGetReallyFreeSpace
function and keep the old one for compatibility. What do we want?
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings