Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 0d24d16

Browse files
author
Alexander Korotkov
committed
Fix various bugs with page compaction
1 parent 308f1b0 commit 0d24d16

File tree

3 files changed

+20
-30
lines changed

3 files changed

+20
-30
lines changed

contrib/in_memory/btree.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ insert_to_leaf(BTreeStack *stack,
320320
}
321321
else
322322
{
323-
int old_item_size = BTREE_PAGE_GET_ITEM_SIZE(p, offset);
323+
int old_item_size = BTREE_PAGE_GET_ITEM_SIZE(p, offset);
324324

325325
/*
326326
* We should be able to undo this action without memory
@@ -679,6 +679,7 @@ btree_modify_internal(BTreeDescr *desc, BTreeModifyAction action,
679679
}
680680

681681
undo_pos = preserve_undo_record(OLeafTupleHeaderSize);
682+
682683
if (!UndoPosIsValid(undo_pos))
683684
{
684685
unlock_page(p, state);

contrib/in_memory/btree_page.c

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -302,27 +302,12 @@ page_fits_item(Page p, OffsetNumber offset, LocationIndex size, bool replace)
302302
{
303303
LocationIndex free_space;
304304
BTreePageHeader *header = (BTreePageHeader *) p;
305+
LocationIndex space_needed;
305306
LocationIndex vacated_bytes = header->nVacatedBytes;
306307

307308
Assert(size == MAXALIGN(size));
308309

309-
if (!replace)
310-
{
311-
free_space = page_get_free_space(p);
312-
313-
if (free_space < size + sizeof(OffsetNumber))
314-
{
315-
if (free_space + header->nVacatedBytes < size + sizeof(OffsetNumber))
316-
return PageNotFit;
317-
else
318-
return PageFitAfterCompaction;
319-
}
320-
else
321-
{
322-
return PageFit;
323-
}
324-
}
325-
else
310+
if (replace)
326311
{
327312
LocationIndex oldsize;
328313
OLeafTupleHeader *tupHdr;
@@ -343,19 +328,24 @@ page_fits_item(Page p, OffsetNumber offset, LocationIndex size, bool replace)
343328
if (tupHdr->deleted && TX_IS_CSN(tupHdr->tx))
344329
vacated_bytes -= oldsize - sizeof(OffsetNumber);
345330

346-
free_space = page_get_free_space(p);
331+
space_needed = size - oldsize;
332+
}
333+
else
334+
{
335+
space_needed = size + sizeof(OffsetNumber);
336+
}
347337

348-
if (free_space < size - oldsize)
349-
{
350-
if (free_space + vacated_bytes < size - oldsize)
351-
return PageNotFit;
352-
else
353-
return PageFitAfterCompaction;
354-
}
338+
free_space = page_get_free_space(p);
339+
if (free_space < space_needed)
340+
{
341+
if (PAGE_IS_LEAF(p) && free_space + vacated_bytes >= space_needed)
342+
return PageFitAfterCompaction;
355343
else
356-
{
357-
return PageFit;
358-
}
344+
return PageNotFit;
345+
}
346+
else
347+
{
348+
return PageFit;
359349
}
360350
}
361351

contrib/in_memory/sql/tuple_limit.sql

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,3 @@ INSERT INTO im_test1 VALUES (1, repeat('x', 281));
44
INSERT INTO im_test1 VALUES (2, repeat('x', 289));
55
INSERT INTO im_test1 SELECT id, repeat('x', 280) FROM generate_series(3, 1000) id;
66
SELECT val, count(*) FROM im_test1 GROUP BY val;
7-

0 commit comments

Comments
 (0)