From: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
---|---|
To: | Pg Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | "unaddressable bytes" in BRIN |
Date: | 2015-05-08 22:32:27 |
Message-ID: | 20150508223227.GP2523@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Andres Freund just forwarded me a valgrind error report that Peter
Geoghegan noticed:
==29892== Unaddressable byte(s) found during client check request
==29892== at 0x7D1317: PageAddItem (bufpage.c:314)
==29892== by 0x468106: brin_doinsert (brin_pageops.c:315)
==29892== by 0x4671A5: form_and_insert_tuple (brin.c:1178)
==29892== by 0x466006: brinbuildCallback (brin.c:596)
==29892== by 0x53F6E4: IndexBuildHeapRangeScan (index.c:2548)
==29892== by 0x53EC19: IndexBuildHeapScan (index.c:2161)
==29892== by 0x466443: brinbuild (brin.c:694)
==29892== by 0x92F09F: OidFunctionCall3Coll (fmgr.c:1649)
==29892== by 0x53E924: index_build (index.c:2024)
==29892== by 0x53D5FC: index_create (index.c:1099)
==29892== by 0x60B3B7: DefineIndex (indexcmds.c:605)
==29892== by 0x7E2142: ProcessUtilitySlow (utility.c:1203)
==29892== Address 0xccffd86 is 5,270 bytes inside a block of size 8,192 alloc'd
==29892== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29892== by 0x950425: AllocSetAlloc (aset.c:847)
==29892== by 0x9530A5: palloc (mcxt.c:821)
==29892== by 0x4C6A32: heap_tuple_untoast_attr (tuptoaster.c:215)
==29892== by 0x9302F2: pg_detoast_datum (fmgr.c:2238)
==29892== by 0x8794C8: numeric_lt (numeric.c:2060)
==29892== by 0x92E211: FunctionCall2Coll (fmgr.c:1323)
==29892== by 0x46C441: brin_minmax_add_value (brin_minmax.c:113)
==29892== by 0x92E49C: FunctionCall4Coll (fmgr.c:1375)
==29892== by 0x466108: brinbuildCallback (brin.c:618)
==29892== by 0x53F6E4: IndexBuildHeapRangeScan (index.c:2548)
==29892== by 0x53EC19: IndexBuildHeapScan (index.c:2161)
What I think this means is that during an index build
brin_minmax_add_value() called numeric_lt() which detoasted one of its
input values; later, brin_doinsert() inserts a tuple containing the
value, but it tries to use more bytes than were allocated. I haven't
had time to actually study what is going on here, but wanted to archive
this publicly. (Value detoasting evidently plays a role here, but I
don't know how.)
--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | Kohei KaiGai | 2015-05-08 22:43:42 | Re: Custom/Foreign-Join-APIs (Re: [v9.5] Custom Plan API) |
Previous Message | Stephen Frost | 2015-05-08 21:59:44 | Re: Postgres GSSAPI Encryption |