Re: SRF memory mgmt patch (was [HACKERS] Concern about
| От | Joe Conway |
|---|---|
| Тема | Re: SRF memory mgmt patch (was [HACKERS] Concern about |
| Дата | |
| Msg-id | 3D6EF4BD.8060908@joeconway.com обсуждение исходный текст |
| Ответ на | SRF memory mgmt patch (was [HACKERS] Concern about memory management with SRFs) (Joe Conway <mail@joeconway.com>) |
| Список | pgsql-patches |
Tom Lane wrote:
> First let's see if we can figure out why the code is failing to fail
> as it stands. The fact that it's not dumping core says there's
> something we don't understand yet ...
I'm not sure if the attached will help figure it out, but at the very
least it was eye-opening for me. I ran a test on
dblink_get_pkey('foobar') that returns 5 rows. I had a breakpoint set in
ExecClearTuple. I found that ExecClearTuple was called a total of 32
times for 5 returned rows!
Relevant to this discussion was that ExecClearTuple was called three
times, with the same slot pointer, for each function call to
dblink_get_pkey. Once in SRF_PERCALL_SETUP (per_MultiFuncCall), once in
TupleGetDatum (ExecStoreTuple), and once in FunctionNext in the loop
that builds the tuplestore.
Unfortunately I have not been able to get back to a point where I see a
coredump :(. But, that did seem to be related to calling the function
with an inappropriate declaration (now it just gives me garbage instead
of dumping core, even though I reverted the per_MultiFuncCall changes I
made earlier). I'll keep messing with this for a while, but I was hoping
the attached info would lead to some more suggestions of where to be
looking.
Thanks,
Joe
test=# select * from dblink_get_pkey('foobar');
position | colname
----------+---------
1 | f1
2 | f2
3 | f3
4 | f4
5 | f5
(5 rows)
- breakpoint set at ExecClearTuple
- ExecClearTuple called a total of 32 times
========================================
15 sets of 3 calls for 5 returned tuples
========================================
set 1:
------------------------------------------------------------------
this one is from: SRF_PERCALL_SETUP() == per_MultiFuncCall()
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x0817cf49 in per_MultiFuncCall (fcinfo=0xbfffe8e0) at funcapi.c:88
#2 0x400172b3 in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:911
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
this one is from: TupleGetDatum() == ExecStoreTuple()
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f3b18, slot=0x82ea07c, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x4001733f in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:941
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
this one is from: explicit call in FunctionNext()
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e9ee6 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:107
#2 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#3 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 2:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x0817cf49 in per_MultiFuncCall (fcinfo=0xbfffe8e0) at funcapi.c:88
#2 0x400172b3 in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:911
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f3ac0, slot=0x82ea07c, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x4001733f in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:941
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e9ee6 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:107
#2 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#3 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 3:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x0817cf49 in per_MultiFuncCall (fcinfo=0xbfffe8e0) at funcapi.c:88
#2 0x400172b3 in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:911
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f3ac0, slot=0x82ea07c, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x4001733f in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:941
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e9ee6 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:107
#2 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#3 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 4:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x0817cf49 in per_MultiFuncCall (fcinfo=0xbfffe8e0) at funcapi.c:88
#2 0x400172b3 in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:911
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f3ac0, slot=0x82ea07c, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x4001733f in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:941
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e9ee6 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:107
#2 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#3 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 5:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x0817cf49 in per_MultiFuncCall (fcinfo=0xbfffe8e0) at funcapi.c:88
#2 0x400172b3 in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:911
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f3ac0, slot=0x82ea07c, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x4001733f in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:941
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x080e9ee6 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:107
#2 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#3 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
=============================================================================
one set from SRF_PERCALL_SETUP() during last pass when it decides it is done
=============================================================================
#0 ExecClearTuple (slot=0x82ea07c) at execTuples.c:395
#1 0x0817cf49 in per_MultiFuncCall (fcinfo=0xbfffe8e0) at funcapi.c:88
#2 0x400172b3 in dblink_get_pkey (fcinfo=0xbfffe8e0) at dblink.c:911
#3 0x080e341a in ExecMakeFunctionResult (fcache=0x82e8d1c, arguments=0x82e8330, econtext=0x82e89bc, isNull=0xbfffeac7
"",
=============================================================================
10 sets of 2 calls for 5 returned tuples
=============================================================================
set 1:
------------------------------------------------------------------
this one is from:
return ExecStoreTuple(...
in FunctionNext
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82ea148, slot=0x82e8938, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x080e9f21 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:127
#3 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
this one is from:
return ExecStoreTuple(...
in ExecProject
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5bf8, slot=0x82e8924, buffer=0, shouldFree=1 '\001') at execTuples.c:359
#2 0x080e42cf in ExecProject (projInfo=0x82e8ca8, isDone=0xbfffeaf8) at execQual.c:2060
#3 0x080e438b in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:134
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 2:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5ac8, slot=0x82e8938, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x080e9f21 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:127
#3 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5d9c, slot=0x82e8924, buffer=0, shouldFree=1 '\001') at execTuples.c:359
#2 0x080e42cf in ExecProject (projInfo=0x82e8ca8, isDone=0xbfffeaf8) at execQual.c:2060
#3 0x080e438b in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:134
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 3:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5b14, slot=0x82e8938, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x080e9f21 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:127
#3 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5bf8, slot=0x82e8924, buffer=0, shouldFree=1 '\001') at execTuples.c:359
#2 0x080e42cf in ExecProject (projInfo=0x82e8ca8, isDone=0xbfffeaf8) at execQual.c:2060
#3 0x080e438b in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:134
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 4:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5b60, slot=0x82e8938, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x080e9f21 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:127
#3 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5d9c, slot=0x82e8924, buffer=0, shouldFree=1 '\001') at execTuples.c:359
#2 0x080e42cf in ExecProject (projInfo=0x82e8ca8, isDone=0xbfffeaf8) at execQual.c:2060
#3 0x080e438b in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:134
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
set 5:
------------------------------------------------------------------
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5bac, slot=0x82e8938, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x080e9f21 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:127
#3 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x82f5bf8, slot=0x82e8924, buffer=0, shouldFree=1 '\001') at execTuples.c:359
#2 0x080e42cf in ExecProject (projInfo=0x82e8ca8, isDone=0xbfffeaf8) at execQual.c:2060
#3 0x080e438b in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:134
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
=============================================================================
one more sets of 2 calls - last pass to get an "all done"?
=============================================================================
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x0, slot=0x82e8938, buffer=0, shouldFree=0 '\0') at execTuples.c:359
#2 0x080e9f21 in FunctionNext (node=0x82e8798) at nodeFunctionscan.c:127
#3 0x080e4341 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:97
#4 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080e4667 in ExecStoreTuple (tuple=0x0, slot=0x82e8924, buffer=0, shouldFree=1 '\001') at execTuples.c:359
#2 0x080e4360 in ExecScan (node=0x82e8798, accessMtd=0x80e9e68 <FunctionNext>) at execScan.c:110
#3 0x080e9f3f in ExecFunctionScan (node=0x82e8798) at nodeFunctionscan.c:146
=============================================================================
2 sets - cleanup time in ExecEndFunctionScan
=============================================================================
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080ea1cc in ExecEndFunctionScan (node=0x82e8798) at nodeFunctionscan.c:318
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080ea1d5 in ExecEndFunctionScan (node=0x82e8798) at nodeFunctionscan.c:319
=============================================================================
2 sets - cleanup time in ExecDropTupleTable
=============================================================================
#0 ExecClearTuple (slot=0x82e8924) at execTuples.c:395
#1 0x080e44c9 in ExecDropTupleTable (table=0x82e8908, shouldFree=1) at execTuples.c:204
#0 ExecClearTuple (slot=0x82e8938) at execTuples.c:395
#1 0x080e44c9 in ExecDropTupleTable (table=0x82e8908, shouldFree=1) at execTuples.c:204
В списке pgsql-patches по дате отправления: