On 2.12.2014 06:14, Jeff Davis wrote: > On Sun, 2014-11-30 at 17:49 -0800, Peter Geoghegan wrote: >> On Mon, Nov 17, 2014 at 11:39 PM, Jeff Davis <pg...@j-davis.com> wrote: >>> I can also just move isReset there, and keep mem_allocated as a uint64. >>> That way, if I find later that I want to track the aggregated value for >>> the child contexts as well, I can split it into two uint32s. I'll hold >>> off any any such optimizations until I see some numbers from HashAgg >>> though. >> >> I took a quick look at memory-accounting-v8.patch. >> >> Is there some reason why mem_allocated is a uint64? All other things >> being equal, I'd follow the example of tuplesort.c's >> MemoryContextAllocHuge() API, which (following bugfix commit >> 79e0f87a1) uses int64 variables to track available memory and so on. > > No reason. New version attached; that's the only change.
I've started reviewing this today. It does not apply cleanly on current head, because of 4a14f13a committed a few days ago. That commit changed the constants in src/include/utils/hsearch.h, so the patch needs to use this: #define HASH_NOCHILDCXT 0x4000 /* ... */ That's the only conflict, and after fixing it it compiles OK. However, I got a segfault on the very first query I tried :-( create table test_hash_agg as select i AS a, i AS b, i AS c, i AS d from generate_series(1,10000000) s(i); analyze test_hash_agg; select a, count(*) from test_hash_agg where a < 100000 group by a; With a fresh cluster (default config), I get this: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed. The backtrace looks like this (full attached): Program received signal SIGSEGV, Segmentation fault. advance_transition_function (aggstate=aggstate@entry=0x2b5c5f0, peraggstate=peraggstate@entry=0x2b5efd0, pergroupstate=pergroupstate@entry=0x8) at nodeAgg.c:468 468 if (pergroupstate->noTransValue) (gdb) bt #0 advance_transition_function at nodeAgg.c:468 #1 0x00000000005c3494 in advance_aggregates at nodeAgg.c:624 #2 0x00000000005c3dc2 in agg_fill_hash_table at nodeAgg.c:1640 #3 ExecAgg (node=node@entry=0x2b5c5f0) at nodeAgg.c:1338 (gdb) print pergroupstate->noTransValue Cannot access memory at address 0x11 (gdb) print pergroupstate $1 = (AggStatePerGroup) 0x8 My guess is something is scribbling over the pergroup memory, or maybe the memory context gets released, or something. In any case, it's easily reproducible, and apparently deterministic (always exactly the same values, no randomness). regards Tomas
Program received signal SIGSEGV, Segmentation fault. advance_transition_function (aggstate=aggstate@entry=0x2b5c5f0, peraggstate=peraggstate@entry=0x2b5efd0, pergroupstate=pergroupstate@entry=0x8) at nodeAgg.c:468 468 if (pergroupstate->noTransValue) (gdb) bt #0 advance_transition_function (aggstate=aggstate@entry=0x2b5c5f0, peraggstate=peraggstate@entry=0x2b5efd0, pergroupstate=pergroupstate@entry=0x8) at nodeAgg.c:468 #1 0x00000000005c3494 in advance_aggregates (aggstate=aggstate@entry=0x2b5c5f0, pergroup=pergroup@entry=0x8) at nodeAgg.c:624 #2 0x00000000005c3dc2 in agg_fill_hash_table (aggstate=0x2b5c5f0) at nodeAgg.c:1640 #3 ExecAgg (node=node@entry=0x2b5c5f0) at nodeAgg.c:1338 #4 0x00000000005b6c68 in ExecProcNode (node=node@entry=0x2b5c5f0) at execProcnode.c:486 #5 0x00000000005b3e90 in ExecutePlan (dest=0xbffa40 <donothingDR>, direction=<optimized out>, numberTuples=0, sendTuples=1 '\001', operation=CMD_SELECT, planstate=0x2b5c5f0, estate=0x2b5c4d8) at execMain.c:1480 #6 standard_ExecutorRun (queryDesc=0x2b58d78, direction=<optimized out>, count=0) at execMain.c:308 #7 0x000000000056df73 in ExplainOnePlan (plannedstmt=plannedstmt@entry=0x2b58ce0, into=into@entry=0x0, es=es@entry=0x7fff6fa066c0, queryString=<optimized out>, params=0x0, planduration=planduration@entry=0x7fff6fa06650) at explain.c:487 #8 0x000000000056e22d in ExplainOneQuery (query=<optimized out>, into=0x0, es=0x7fff6fa066c0, queryString=0x2b0bf68 "explain analyze select a, count(*) from test_hash_agg where a < 100000 group by a;", params=0x0) at explain.c:341 #9 0x000000000056e670 in ExplainQuery (stmt=stmt@entry=0x2b0d248, queryString=0x2b0bf68 "explain analyze select a, count(*) from test_hash_agg where a < 100000 group by a;", params=params@entry=0x0, dest=0x2b1b490) at explain.c:232 #10 0x00000000006b5af6 in standard_ProcessUtility (parsetree=0x2b0d248, queryString=<optimized out>, context=<optimized out>, params=0x0, dest=<optimized out>, completionTag=0x7fff6fa067d0 "") at utility.c:648 #11 0x00000000006b2c61 in PortalRunUtility (portal=portal@entry=0x2b4c3b8, utilityStmt=0x2b0d248, isTopLevel=<optimized out>, dest=dest@entry=0x2b1b490, completionTag=completionTag@entry=0x7fff6fa067d0 "") at pquery.c:1187 #12 0x00000000006b3add in FillPortalStore (portal=portal@entry=0x2b4c3b8, isTopLevel=isTopLevel@entry=1 '\001') at pquery.c:1061 #13 0x00000000006b45cf in PortalRun (portal=portal@entry=0x2b4c3b8, count=count@entry=9223372036854775807, isTopLevel=isTopLevel@entry=1 '\001', dest=dest@entry=0x2b3e828, altdest=altdest@entry=0x2b3e828, completionTag=completionTag@entry=0x7fff6fa06bd0 "") at pquery.c:785 #14 0x00000000006b1fe3 in exec_simple_query (query_string=0x2b0bf68 "explain analyze select a, count(*) from test_hash_agg where a < 100000 group by a;") at postgres.c:1045 #15 PostgresMain (argc=<optimized out>, argv=argv@entry=0x2aa5d20, dbname=0x2aa5b88 "test", username=<optimized out>) at postgres.c:4012 #16 0x000000000046278f in BackendRun (port=0x2ac5b10) at postmaster.c:4130 #17 BackendStartup (port=0x2ac5b10) at postmaster.c:3805 #18 ServerLoop () at postmaster.c:1573 #19 0x0000000000658156 in PostmasterMain (argc=argc@entry=3, argv=argv@entry=0x2aa4900) at postmaster.c:1220 #20 0x000000000046338b in main (argc=3, argv=0x2aa4900) at main.c:220 (gdb) print pergroupstate->noTransValue Cannot access memory at address 0x11 (gdb) print pergroupstate $1 = (AggStatePerGroup) 0x8
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers