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

Commit 69e3431

Browse files
author
Alexander Korotkov
committed
Fix for valgrind
Valgrind doesn't take into account that mmap'ed memory might be shared. This is why Valgrind reports false positives for memory which was undefined in current process, but already overridden by another process. The best thing we can do is to evade writing undefined memory from any process.
1 parent dc5f9aa commit 69e3431

File tree

3 files changed

+18
-15
lines changed

3 files changed

+18
-15
lines changed

contrib/in_memory/btree.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -166,17 +166,17 @@ btree_split(BTreeDescr *desc, Page p, OffsetNumber *offset, bool *place_right,
166166
if (*place_right)
167167
{
168168
if (!replace)
169-
add_page_item(new_page, *offset, tuplesize + header_size);
169+
add_page_item(new_page, *offset, MAXALIGN(tuplesize) + header_size);
170170
else
171-
resize_page_item(new_page, *offset, tuplesize + header_size);
171+
resize_page_item(new_page, *offset, MAXALIGN(tuplesize) + header_size);
172172
tuple_ptr = BTREE_PAGE_GET_ITEM(new_page, *offset);
173173
}
174174
else
175175
{
176176
if (!replace)
177-
add_page_item(p, *offset, tuplesize + header_size);
177+
add_page_item(p, *offset, MAXALIGN(tuplesize) + header_size);
178178
else
179-
resize_page_item(p, *offset, tuplesize + header_size);
179+
resize_page_item(p, *offset, MAXALIGN(tuplesize) + header_size);
180180
tuple_ptr = BTREE_PAGE_GET_ITEM(p, *offset);
181181
}
182182
memcpy(tuple_ptr, tupleheader, header_size);
@@ -188,7 +188,7 @@ btree_split(BTreeDescr *desc, Page p, OffsetNumber *offset, bool *place_right,
188188
if (leaf)
189189
{
190190
rightbound_key = desc->tuple_make_key(desc, rightbound_key);
191-
rightbound_key_size = MAXALIGN(desc->key_len(desc, rightbound_key));
191+
rightbound_key_size = desc->key_len(desc, rightbound_key);
192192
}
193193
else
194194
{
@@ -197,9 +197,9 @@ btree_split(BTreeDescr *desc, Page p, OffsetNumber *offset, bool *place_right,
197197
}
198198

199199
if (was_rightmost)
200-
add_page_item(p, BTREE_HIKEY, rightbound_key_size);
200+
add_page_item(p, BTREE_HIKEY, MAXALIGN(rightbound_key_size));
201201
else
202-
resize_page_item(p, BTREE_HIKEY, rightbound_key_size);
202+
resize_page_item(p, BTREE_HIKEY, MAXALIGN(rightbound_key_size));
203203

204204
memcpy(BTREE_PAGE_GET_ITEM(p, BTREE_HIKEY),
205205
rightbound_key, rightbound_key_size);
@@ -275,7 +275,8 @@ insert_to_leaf(BTreeStack *stack,
275275

276276
while (true)
277277
{
278-
PageFitsItemResult fit = page_fits_item(p, offset, tuplen + tupheaderlen, replace);
278+
LocationIndex itemsize = MAXALIGN(tuplen) + tupheaderlen;
279+
PageFitsItemResult fit = page_fits_item(p, offset, itemsize, replace);
279280

280281
if (fit != PageNotFit)
281282
{
@@ -312,7 +313,7 @@ insert_to_leaf(BTreeStack *stack,
312313
state = modify_page(p, state);
313314
if (!replace)
314315
{
315-
add_page_item(p, offset, tuplen + tupheaderlen);
316+
add_page_item(p, offset, itemsize);
316317

317318
/* Increment number of tuples in progress */
318319
if (level == 0)
@@ -327,8 +328,8 @@ insert_to_leaf(BTreeStack *stack,
327328
* allocation. Thus we shouldn't cut space occupied by this
328329
* page item.
329330
*/
330-
if (tuplen + tupheaderlen > old_item_size)
331-
resize_page_item(p, offset, tuplen + tupheaderlen);
331+
if (itemsize > old_item_size)
332+
resize_page_item(p, offset, itemsize);
332333

333334
if (level == 0)
334335
{
@@ -777,7 +778,7 @@ btree_modify_internal(BTreeDescr *desc, BTreeModifyAction action,
777778
}
778779
}
779780

780-
tuplen = MAXALIGN(desc->tuple_len(desc, tuple));
781+
tuplen = desc->tuple_len(desc, tuple);
781782
insert_to_leaf(&stack, tuple, tuplen, &leaf_header, replace, self_update, undo_pos);
782783

783784
return result;

contrib/in_memory/btree_page.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "access/transam.h"
2121
#include "storage/s_lock.h"
22+
#include "utils/memdebug.h"
2223

2324
/* Page state flags */
2425
#define STATE_LOCKED_FLAG 1
@@ -103,6 +104,7 @@ unlock_page(Page p, uint32 state)
103104
}
104105
}
105106

107+
VALGRIND_CHECK_MEM_IS_DEFINED(GET_PAGE(pagenum), IN_MEMORY_BLCKSZ);
106108
state = UNLOCK_STATE(state);
107109
pg_write_barrier();
108110
pg_atomic_write_u32(&header->state, state);

contrib/in_memory/btree_undo.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,14 @@ apply_undo(BTreeDescr *desc, Page p, OffsetNumber offset, bool loop)
5757

5858
Pointer prev_item = GET_UNDO_REC(tuphdr->undoPos);
5959
Pointer prev_tuple = prev_item + OLeafTupleHeaderSize;
60-
int prev_tuplen = MAXALIGN(desc->tuple_len(desc, prev_tuple));
61-
int prev_itemlen = prev_tuplen + OLeafTupleHeaderSize;
60+
int prev_tuplen = desc->tuple_len(desc, prev_tuple);
61+
int prev_itemlen = OLeafTupleHeaderSize + MAXALIGN(prev_tuplen);
6262
OLeafTupleHeader *prev_header = (OLeafTupleHeader *) prev_item;
6363

6464
Assert(prev_itemlen <= BTREE_PAGE_GET_ITEM_SIZE(p, offset));
6565
resize_page_item(p, offset, prev_itemlen);
6666
item = BTREE_PAGE_GET_ITEM(p, offset);
67-
memcpy(item, prev_item, prev_itemlen);
67+
memcpy(item, prev_item, OLeafTupleHeaderSize + prev_tuplen);
6868

6969
/*
7070
* If previous version was committed then update number of in-progress

0 commit comments

Comments
 (0)