Re: Additional DTrace Probes
От | Bruce Momjian |
---|---|
Тема | Re: Additional DTrace Probes |
Дата | |
Msg-id | 200904021903.n32J38x27211@momjian.us обсуждение исходный текст |
Ответ на | Re: Additional DTrace Probes (Zdenek Kotala <Zdenek.Kotala@Sun.COM>) |
Список | pgsql-hackers |
OK, updated patch attached and applied; thanks. --------------------------------------------------------------------------- Zdenek Kotala wrote: > It looks OK now. > > Zdenek > > Dne 8.03.09 21:58, Robert Lor napsal(a): > > >> 2) Maybe > >> > >> TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(true, -1, -1); > >> > >> would be better. Because slru_errcause, slru_errno can contains garbage > >> in situation when everything goes fine. Same for write. > > > > I've made the changes per your suggestion although one can argue that > > the script can check arg0, and if it's true, avoid using arg1 and arg2 > > as they are meaningless. > > Thanks. > > >> > >> I think it is committable for 8.4. > >> > > > > That would be awesome! > > yeah, but it depends on commiters :-) > > Zdenek > > -- > Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-hackers -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + If your life is a hard drive, Christ can be your backup. + Index: src/backend/access/transam/slru.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/access/transam/slru.c,v retrieving revision 1.45 diff -c -c -r1.45 slru.c *** src/backend/access/transam/slru.c 1 Jan 2009 17:23:36 -0000 1.45 --- src/backend/access/transam/slru.c 2 Apr 2009 19:01:55 -0000 *************** *** 57,62 **** --- 57,63 ---- #include "storage/fd.h" #include "storage/shmem.h" #include "miscadmin.h" + #include "pg_trace.h" /* *************** *** 372,377 **** --- 373,379 ---- { SlruShared shared = ctl->shared; + TRACE_POSTGRESQL_SLRU_READPAGE_START((uintptr_t)ctl, pageno, write_ok, xid); /* Outer loop handles restart if we must wait for someone else's I/O */ for (;;) { *************** *** 399,404 **** --- 401,407 ---- } /* Otherwise, it's ready to use */ SlruRecentlyUsed(shared, slotno); + TRACE_POSTGRESQL_SLRU_READPAGE_DONE(slotno); return slotno; } *************** *** 446,451 **** --- 449,455 ---- SlruReportIOError(ctl, pageno, xid); SlruRecentlyUsed(shared, slotno); + TRACE_POSTGRESQL_SLRU_READPAGE_DONE(slotno); return slotno; } } *************** *** 470,475 **** --- 474,481 ---- SlruShared shared = ctl->shared; int slotno; + TRACE_POSTGRESQL_SLRU_READPAGE_READONLY((uintptr_t)ctl, pageno, xid); + /* Try to find the page while holding only shared lock */ LWLockAcquire(shared->ControlLock, LW_SHARED); *************** *** 511,516 **** --- 517,524 ---- int pageno = shared->page_number[slotno]; bool ok; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_START((uintptr_t)ctl, pageno, slotno); + /* If a write is in progress, wait for it to finish */ while (shared->page_status[slotno] == SLRU_PAGE_WRITE_IN_PROGRESS && shared->page_number[slotno] == pageno) *************** *** 525,531 **** --- 533,542 ---- if (!shared->page_dirty[slotno] || shared->page_status[slotno] != SLRU_PAGE_VALID || shared->page_number[slotno] != pageno) + { + TRACE_POSTGRESQL_SLRU_WRITEPAGE_DONE(); return; + } /* * Mark the slot write-busy, and clear the dirtybit. After this point, a *************** *** 569,574 **** --- 580,587 ---- /* Now it's okay to ereport if we failed */ if (!ok) SlruReportIOError(ctl, pageno, InvalidTransactionId); + + TRACE_POSTGRESQL_SLRU_WRITEPAGE_DONE(); } /* *************** *** 593,598 **** --- 606,613 ---- SlruFileName(ctl, path, segno); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_START((uintptr_t)ctl, path, pageno, slotno); + /* * In a crash-and-restart situation, it's possible for us to receive * commands to set the commit status of transactions whose bits are in *************** *** 607,612 **** --- 622,628 ---- { slru_errcause = SLRU_OPEN_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } *************** *** 614,619 **** --- 630,636 ---- (errmsg("file \"%s\" doesn't exist, reading as zeroes", path))); MemSet(shared->page_buffer[slotno], 0, BLCKSZ); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(true, -1, -1); return true; } *************** *** 622,627 **** --- 639,645 ---- slru_errcause = SLRU_SEEK_FAILED; slru_errno = errno; close(fd); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } *************** *** 631,636 **** --- 649,655 ---- slru_errcause = SLRU_READ_FAILED; slru_errno = errno; close(fd); + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } *************** *** 638,646 **** --- 657,668 ---- { slru_errcause = SLRU_CLOSE_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } + TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(true, -1, -1); + return true; } *************** *** 668,673 **** --- 690,697 ---- char path[MAXPGPATH]; int fd = -1; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_START((uintptr_t)ctl, pageno, slotno); + /* * Honor the write-WAL-before-data rule, if appropriate, so that we do not * write out data before associated WAL records. This is the same action *************** *** 753,758 **** --- 777,783 ---- { slru_errcause = SLRU_OPEN_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } *************** *** 781,786 **** --- 806,812 ---- slru_errno = errno; if (!fdata) close(fd); + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } *************** *** 794,799 **** --- 820,826 ---- slru_errno = errno; if (!fdata) close(fd); + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } *************** *** 808,813 **** --- 835,841 ---- slru_errcause = SLRU_FSYNC_FAILED; slru_errno = errno; close(fd); + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } *************** *** 815,824 **** --- 843,854 ---- { slru_errcause = SLRU_CLOSE_FAILED; slru_errno = errno; + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno); return false; } } + TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(true, -1, -1); return true; } Index: src/backend/executor/execScan.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/execScan.c,v retrieving revision 1.44 diff -c -c -r1.44 execScan.c *** src/backend/executor/execScan.c 1 Jan 2009 17:23:41 -0000 1.44 --- src/backend/executor/execScan.c 2 Apr 2009 19:01:55 -0000 *************** *** 20,25 **** --- 20,26 ---- #include "executor/executor.h" #include "miscadmin.h" + #include "pg_trace.h" #include "utils/memutils.h" *************** *** 60,65 **** --- 61,68 ---- qual = node->ps.qual; projInfo = node->ps.ps_ProjInfo; + TRACE_POSTGRESQL_EXECUTOR_SCAN((uintptr_t)node, ((Scan *)node->ps.plan)->scanrelid, (uintptr_t)accessMtd); + /* * If we have neither a qual to check nor a projection to do, just skip * all the overhead and return the raw scan tuple. Index: src/backend/executor/nodeAgg.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeAgg.c,v retrieving revision 1.164 diff -c -c -r1.164 nodeAgg.c *** src/backend/executor/nodeAgg.c 1 Jan 2009 17:23:41 -0000 1.164 --- src/backend/executor/nodeAgg.c 2 Apr 2009 19:01:55 -0000 *************** *** 79,84 **** --- 79,85 ---- #include "parser/parse_agg.h" #include "parser/parse_coerce.h" #include "parser/parse_oper.h" + #include "pg_trace.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/lsyscache.h" *************** *** 814,819 **** --- 815,822 ---- if (node->agg_done) return NULL; + TRACE_POSTGRESQL_EXECUTOR_AGG((uintptr_t)node, ((Agg *) node->ss.ps.plan)->aggstrategy); + /* * Check to see if we're still projecting out tuples from a previous agg * tuple (because there is a function-returning-set in the projection Index: src/backend/executor/nodeGroup.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v retrieving revision 1.73 diff -c -c -r1.73 nodeGroup.c *** src/backend/executor/nodeGroup.c 1 Jan 2009 17:23:41 -0000 1.73 --- src/backend/executor/nodeGroup.c 2 Apr 2009 19:01:55 -0000 *************** *** 24,29 **** --- 24,30 ---- #include "executor/executor.h" #include "executor/nodeGroup.h" + #include "pg_trace.h" /* *************** *** 49,54 **** --- 50,57 ---- numCols = ((Group *) node->ss.ps.plan)->numCols; grpColIdx = ((Group *) node->ss.ps.plan)->grpColIdx; + TRACE_POSTGRESQL_EXECUTOR_GROUP((uintptr_t)node, numCols); + /* * Check to see if we're still projecting out tuples from a previous group * tuple (because there is a function-returning-set in the projection Index: src/backend/executor/nodeHash.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v retrieving revision 1.118 diff -c -c -r1.118 nodeHash.c *** src/backend/executor/nodeHash.c 21 Mar 2009 00:04:38 -0000 1.118 --- src/backend/executor/nodeHash.c 2 Apr 2009 19:01:55 -0000 *************** *** 33,38 **** --- 33,39 ---- #include "executor/nodeHashjoin.h" #include "miscadmin.h" #include "parser/parse_expr.h" + #include "pg_trace.h" #include "utils/dynahash.h" #include "utils/memutils.h" #include "utils/lsyscache.h" *************** *** 79,84 **** --- 80,87 ---- ExprContext *econtext; uint32 hashvalue; + TRACE_POSTGRESQL_EXECUTOR_HASH_MULTI((uintptr_t)node); + /* must provide our own instrumentation support */ if (node->ps.instrument) InstrStartNode(node->ps.instrument); Index: src/backend/executor/nodeHashjoin.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v retrieving revision 1.98 diff -c -c -r1.98 nodeHashjoin.c *** src/backend/executor/nodeHashjoin.c 21 Mar 2009 00:04:38 -0000 1.98 --- src/backend/executor/nodeHashjoin.c 2 Apr 2009 19:01:55 -0000 *************** *** 19,24 **** --- 19,25 ---- #include "executor/hashjoin.h" #include "executor/nodeHash.h" #include "executor/nodeHashjoin.h" + #include "pg_trace.h" #include "utils/memutils.h" *************** *** 61,66 **** --- 62,69 ---- uint32 hashvalue; int batchno; + TRACE_POSTGRESQL_EXECUTOR_HASHJOIN((uintptr_t)node); + /* * get information from HashJoin node */ Index: src/backend/executor/nodeLimit.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeLimit.c,v retrieving revision 1.36 diff -c -c -r1.36 nodeLimit.c *** src/backend/executor/nodeLimit.c 4 Mar 2009 10:55:00 -0000 1.36 --- src/backend/executor/nodeLimit.c 2 Apr 2009 19:01:55 -0000 *************** *** 23,28 **** --- 23,29 ---- #include "executor/executor.h" #include "executor/nodeLimit.h" + #include "pg_trace.h" static void recompute_limits(LimitState *node); *************** *** 41,46 **** --- 42,49 ---- TupleTableSlot *slot; PlanState *outerPlan; + TRACE_POSTGRESQL_EXECUTOR_LIMIT((uintptr_t)node); + /* * get information from the node */ Index: src/backend/executor/nodeMaterial.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeMaterial.c,v retrieving revision 1.66 diff -c -c -r1.66 nodeMaterial.c *** src/backend/executor/nodeMaterial.c 27 Mar 2009 18:30:21 -0000 1.66 --- src/backend/executor/nodeMaterial.c 2 Apr 2009 19:01:55 -0000 *************** *** 24,29 **** --- 24,30 ---- #include "executor/executor.h" #include "executor/nodeMaterial.h" #include "miscadmin.h" + #include "pg_trace.h" /* ---------------------------------------------------------------- * ExecMaterial *************** *** 45,50 **** --- 46,53 ---- bool eof_tuplestore; TupleTableSlot *slot; + TRACE_POSTGRESQL_EXECUTOR_MATERIAL((uintptr_t)node); + /* * get state info from node */ Index: src/backend/executor/nodeMergejoin.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeMergejoin.c,v retrieving revision 1.94 diff -c -c -r1.94 nodeMergejoin.c *** src/backend/executor/nodeMergejoin.c 1 Jan 2009 17:23:42 -0000 1.94 --- src/backend/executor/nodeMergejoin.c 2 Apr 2009 19:01:55 -0000 *************** *** 98,103 **** --- 98,104 ---- #include "executor/execdefs.h" #include "executor/nodeMergejoin.h" #include "miscadmin.h" + #include "pg_trace.h" #include "utils/acl.h" #include "utils/lsyscache.h" #include "utils/memutils.h" *************** *** 565,570 **** --- 566,573 ---- bool doFillOuter; bool doFillInner; + TRACE_POSTGRESQL_EXECUTOR_MERGEJOIN((uintptr_t)node); + /* * get information from node */ Index: src/backend/executor/nodeNestloop.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeNestloop.c,v retrieving revision 1.50 diff -c -c -r1.50 nodeNestloop.c *** src/backend/executor/nodeNestloop.c 1 Jan 2009 17:23:42 -0000 1.50 --- src/backend/executor/nodeNestloop.c 2 Apr 2009 19:01:55 -0000 *************** *** 23,28 **** --- 23,29 ---- #include "executor/execdebug.h" #include "executor/nodeNestloop.h" + #include "pg_trace.h" #include "utils/memutils.h" *************** *** 67,72 **** --- 68,75 ---- List *otherqual; ExprContext *econtext; + TRACE_POSTGRESQL_EXECUTOR_NESTLOOP((uintptr_t)node); + /* * get information from the node */ Index: src/backend/executor/nodeSetOp.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeSetOp.c,v retrieving revision 1.28 diff -c -c -r1.28 nodeSetOp.c *** src/backend/executor/nodeSetOp.c 1 Jan 2009 17:23:42 -0000 1.28 --- src/backend/executor/nodeSetOp.c 2 Apr 2009 19:01:55 -0000 *************** *** 46,51 **** --- 46,52 ---- #include "executor/executor.h" #include "executor/nodeSetOp.h" + #include "pg_trace.h" #include "utils/memutils.h" *************** *** 196,201 **** --- 197,204 ---- SetOp *plannode = (SetOp *) node->ps.plan; TupleTableSlot *resultTupleSlot = node->ps.ps_ResultTupleSlot; + TRACE_POSTGRESQL_EXECUTOR_SETOP((uintptr_t)node); + /* * If the previously-returned tuple needs to be returned more than once, * keep returning it. Index: src/backend/executor/nodeSort.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeSort.c,v retrieving revision 1.63 diff -c -c -r1.63 nodeSort.c *** src/backend/executor/nodeSort.c 1 Jan 2009 17:23:42 -0000 1.63 --- src/backend/executor/nodeSort.c 2 Apr 2009 19:01:55 -0000 *************** *** 18,23 **** --- 18,24 ---- #include "executor/execdebug.h" #include "executor/nodeSort.h" #include "miscadmin.h" + #include "pg_trace.h" #include "utils/tuplesort.h" *************** *** 53,58 **** --- 54,61 ---- dir = estate->es_direction; tuplesortstate = (Tuplesortstate *) node->tuplesortstate; + TRACE_POSTGRESQL_EXECUTOR_SORT((uintptr_t)node, dir); + /* * If first time through, read all tuples from outer plan and pass them to * tuplesort.c. Subsequent calls just fetch tuples from tuplesort. Index: src/backend/executor/nodeSubplan.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeSubplan.c,v retrieving revision 1.96 diff -c -c -r1.96 nodeSubplan.c *** src/backend/executor/nodeSubplan.c 1 Jan 2009 17:23:42 -0000 1.96 --- src/backend/executor/nodeSubplan.c 2 Apr 2009 19:01:55 -0000 *************** *** 24,29 **** --- 24,30 ---- #include "executor/nodeSubplan.h" #include "nodes/makefuncs.h" #include "optimizer/clauses.h" + #include "pg_trace.h" #include "utils/array.h" #include "utils/lsyscache.h" #include "utils/memutils.h" *************** *** 92,97 **** --- 93,100 ---- ExprContext *innerecontext = node->innerecontext; TupleTableSlot *slot; + TRACE_POSTGRESQL_EXECUTOR_SUBPLAN_HASH((uintptr_t)node); + /* Shouldn't have any direct correlation Vars */ if (subplan->parParam != NIL || node->args != NIL) elog(ERROR, "hashed subplan with direct correlation not supported"); *************** *** 227,232 **** --- 230,237 ---- ListCell *l; ArrayBuildState *astate = NULL; + TRACE_POSTGRESQL_EXECUTOR_SUBPLAN_SCAN((uintptr_t)node); + /* * We are probably in a short-lived expression-evaluation context. Switch * to the per-query context for manipulating the child plan's chgParam, Index: src/backend/executor/nodeUnique.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v retrieving revision 1.58 diff -c -c -r1.58 nodeUnique.c *** src/backend/executor/nodeUnique.c 1 Jan 2009 17:23:42 -0000 1.58 --- src/backend/executor/nodeUnique.c 2 Apr 2009 19:01:55 -0000 *************** *** 35,40 **** --- 35,41 ---- #include "executor/executor.h" #include "executor/nodeUnique.h" + #include "pg_trace.h" #include "utils/memutils.h" *************** *** 50,55 **** --- 51,58 ---- TupleTableSlot *slot; PlanState *outerPlan; + TRACE_POSTGRESQL_EXECUTOR_UNIQUE((uintptr_t)node); + /* * get information from the node */ Index: src/backend/utils/probes.d =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/probes.d,v retrieving revision 1.9 diff -c -c -r1.9 probes.d *** src/backend/utils/probes.d 23 Mar 2009 01:52:38 -0000 1.9 --- src/backend/utils/probes.d 2 Apr 2009 19:01:55 -0000 *************** *** 15,20 **** --- 15,21 ---- * in probe definitions, as they cause compilation errors on Mac OS X 10.5. */ #define LocalTransactionId unsigned int + #define TransactionId unsigned int #define LWLockId int #define LWLockMode int #define LOCKMODE int *************** *** 90,93 **** --- 91,119 ---- probe xlog__switch(); probe wal__buffer__write__dirty__start(); probe wal__buffer__write__dirty__done(); + + probe slru__readpage__start(unsigned long, int, bool, TransactionId); + probe slru__readpage__done(int); + probe slru__readpage__readonly(unsigned long, int, TransactionId); + probe slru__writepage__start(unsigned long, int, int); + probe slru__writepage__done(); + probe slru__readpage__physical__start(unsigned long, char *, int, int); + probe slru__readpage__physical__done(int, int, int); + probe slru__writepage__physical__start(unsigned long, int, int); + probe slru__writepage__physical__done(int, int, int); + + probe executor__scan(unsigned long, unsigned int, unsigned long); + probe executor__agg(unsigned long, int); + probe executor__group(unsigned long, int); + probe executor__hash__multi(unsigned long); + probe executor__hashjoin(unsigned long); + probe executor__limit(unsigned long); + probe executor__material(unsigned long); + probe executor__mergejoin(unsigned long); + probe executor__nestloop(unsigned long); + probe executor__setop(unsigned long); + probe executor__sort(unsigned long, int); + probe executor__subplan__hash(unsigned long); + probe executor__subplan__scan(unsigned long); + probe executor__unique(unsigned long); };
В списке pgsql-hackers по дате отправления:
Предыдущее
От: Tom LaneДата:
Сообщение: Re: fix - function call with variadic parameter for type "any"