Re: DTrace probes patch - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: DTrace probes patch
Date
Msg-id 200812170139.mBH1dBn02125@momjian.us
Whole thread Raw
In response to Re: DTrace probes patch  (Robert Lor <Robert.Lor@Sun.COM>)
List pgsql-hackers
Thanks, applied.

---------------------------------------------------------------------------

Robert Lor wrote:
> Bruce Momjian wrote:
> >
> > I am seeing the following error when linking the backend on a BSD machine:
> >
> >
> >   
> The updated patch attached should fix this problem. My bad for 
> overlooking this.
> 
> -Robert
> 
> 

> Index: src/backend/access/transam/xlog.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xlog.c,v
> retrieving revision 1.322
> diff -u -3 -p -r1.322 xlog.c
> --- src/backend/access/transam/xlog.c    9 Nov 2008 17:51:15 -0000    1.322
> +++ src/backend/access/transam/xlog.c    16 Dec 2008 19:46:08 -0000
> @@ -48,6 +48,7 @@
>  #include "utils/builtins.h"
>  #include "utils/guc.h"
>  #include "utils/ps_status.h"
> +#include "pg_trace.h"
>  
>  
>  /* File path names (all relative to $PGDATA) */
> @@ -486,6 +487,8 @@ XLogInsert(RmgrId rmid, uint8 info, XLog
>      if (info & XLR_INFO_MASK)
>          elog(PANIC, "invalid xlog info mask %02X", info);
>  
> +    TRACE_POSTGRESQL_XLOG_INSERT(rmid, info);
> +
>      /*
>       * In bootstrap mode, we don't actually log anything but XLOG resources;
>       * return a phony record pointer.
> @@ -914,6 +917,8 @@ begin:;
>          XLogwrtRqst FlushRqst;
>          XLogRecPtr    OldSegEnd;
>  
> +        TRACE_POSTGRESQL_XLOG_SWITCH();
> +
>          LWLockAcquire(WALWriteLock, LW_EXCLUSIVE);
>  
>          /*
> @@ -1313,12 +1318,14 @@ AdvanceXLInsertBuffer(bool new_segment)
>                   * Have to write buffers while holding insert lock. This is
>                   * not good, so only write as much as we absolutely must.
>                   */
> +                TRACE_POSTGRESQL_WAL_BUFFER_WRITE_START();
>                  WriteRqst.Write = OldPageRqstPtr;
>                  WriteRqst.Flush.xlogid = 0;
>                  WriteRqst.Flush.xrecoff = 0;
>                  XLogWrite(WriteRqst, false, false);
>                  LWLockRelease(WALWriteLock);
>                  Insert->LogwrtResult = LogwrtResult;
> +                TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DONE();
>              }
>          }
>      }
> @@ -5904,6 +5911,8 @@ CreateCheckPoint(int flags)
>      if (log_checkpoints)
>          LogCheckpointStart(flags);
>  
> +    TRACE_POSTGRESQL_CHECKPOINT_START(flags);
> +
>      /*
>       * Before flushing data, we must wait for any transactions that are
>       * currently in their commit critical sections.  If an xact inserted its
> @@ -6069,6 +6078,11 @@ CreateCheckPoint(int flags)
>      if (log_checkpoints)
>          LogCheckpointEnd();
>  
> +        TRACE_POSTGRESQL_CHECKPOINT_DONE(CheckpointStats.ckpt_bufs_written,
> +                                NBuffers, CheckpointStats.ckpt_segs_added,
> +                                CheckpointStats.ckpt_segs_removed,
> +                                CheckpointStats.ckpt_segs_recycled);
> +
>      LWLockRelease(CheckpointLock);
>  }
>  
> Index: src/backend/storage/buffer/bufmgr.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v
> retrieving revision 1.242
> diff -u -3 -p -r1.242 bufmgr.c
> --- src/backend/storage/buffer/bufmgr.c    19 Nov 2008 10:34:52 -0000    1.242
> +++ src/backend/storage/buffer/bufmgr.c    16 Dec 2008 19:46:11 -0000
> @@ -203,8 +203,7 @@ ReadBuffer_common(SMgrRelation smgr, boo
>      if (isExtend)
>          blockNum = smgrnblocks(smgr, forkNum);
>  
> -    TRACE_POSTGRESQL_BUFFER_READ_START(blockNum, smgr->smgr_rnode.spcNode,
> -        smgr->smgr_rnode.dbNode, smgr->smgr_rnode.relNode, isLocalBuf);
> +    TRACE_POSTGRESQL_BUFFER_READ_START(forkNum, blockNum, smgr->smgr_rnode.spcNode, smgr->smgr_rnode.dbNode,
smgr->smgr_rnode.relNode,isLocalBuf);
 
>  
>      if (isLocalBuf)
>      {
> @@ -253,7 +252,7 @@ ReadBuffer_common(SMgrRelation smgr, boo
>              if (VacuumCostActive)
>                  VacuumCostBalance += VacuumCostPageHit;
>  
> -            TRACE_POSTGRESQL_BUFFER_READ_DONE(blockNum,
> +            TRACE_POSTGRESQL_BUFFER_READ_DONE(forkNum, blockNum,
>                  smgr->smgr_rnode.spcNode,
>                  smgr->smgr_rnode.dbNode,
>                  smgr->smgr_rnode.relNode, isLocalBuf, found);
> @@ -380,9 +379,9 @@ ReadBuffer_common(SMgrRelation smgr, boo
>      if (VacuumCostActive)
>          VacuumCostBalance += VacuumCostPageMiss;
>  
> -    TRACE_POSTGRESQL_BUFFER_READ_DONE(blockNum, smgr->smgr_rnode.spcNode,
> -            smgr->smgr_rnode.dbNode, smgr->smgr_rnode.relNode,
> -            isLocalBuf, found);
> +    TRACE_POSTGRESQL_BUFFER_READ_DONE(forkNum, blockNum,
> +            smgr->smgr_rnode.spcNode, smgr->smgr_rnode.dbNode,
> +            smgr->smgr_rnode.relNode, isLocalBuf, found);
>  
>      return BufferDescriptorGetBuffer(bufHdr);
>  }
> @@ -526,6 +525,11 @@ BufferAlloc(SMgrRelation smgr, ForkNumbe
>               * happens to be trying to split the page the first one got from
>               * StrategyGetBuffer.)
>               */
> +
> +                        TRACE_POSTGRESQL_BUFFER_WRITE_DIRTY_START(forkNum,
> +              blockNum, smgr->smgr_rnode.spcNode,
> +              smgr->smgr_rnode.dbNode, smgr->smgr_rnode.relNode);
> +
>              if (LWLockConditionalAcquire(buf->content_lock, LW_SHARED))
>              {
>                  /*
> @@ -548,6 +552,11 @@ BufferAlloc(SMgrRelation smgr, ForkNumbe
>                  /* OK, do the I/O */
>                  FlushBuffer(buf, NULL);
>                  LWLockRelease(buf->content_lock);
> +
> +                                TRACE_POSTGRESQL_BUFFER_WRITE_DIRTY_DONE(
> +                                  forkNum, blockNum, smgr->smgr_rnode.spcNode,
> +                                  smgr->smgr_rnode.dbNode,
> +                  smgr->smgr_rnode.relNode);
>              }
>              else
>              {
> @@ -1682,6 +1691,7 @@ CheckPointBuffers(int flags)
>      CheckpointStats.ckpt_write_t = GetCurrentTimestamp();
>      BufferSync(flags);
>      CheckpointStats.ckpt_sync_t = GetCurrentTimestamp();
> +    TRACE_POSTGRESQL_BUFFER_CHECKPOINT_SYNC_START();
>      smgrsync();
>      CheckpointStats.ckpt_sync_end_t = GetCurrentTimestamp();
>      TRACE_POSTGRESQL_BUFFER_CHECKPOINT_DONE();
> Index: src/backend/storage/smgr/md.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/storage/smgr/md.c,v
> retrieving revision 1.141
> diff -u -3 -p -r1.141 md.c
> --- src/backend/storage/smgr/md.c    14 Nov 2008 11:09:50 -0000    1.141
> +++ src/backend/storage/smgr/md.c    16 Dec 2008 19:46:12 -0000
> @@ -27,6 +27,7 @@
>  #include "storage/smgr.h"
>  #include "utils/hsearch.h"
>  #include "utils/memutils.h"
> +#include "pg_trace.h"
>  
>  
>  /* interval for calling AbsorbFsyncRequests in mdsync */
> @@ -560,6 +561,8 @@ mdread(SMgrRelation reln, ForkNumber for
>      int            nbytes;
>      MdfdVec    *v;
>  
> +    TRACE_POSTGRESQL_SMGR_MD_READ_START(forknum, blocknum, reln->smgr_rnode.spcNode, reln->smgr_rnode.dbNode,
reln->smgr_rnode.relNode);
> +
>      v = _mdfd_getseg(reln, forknum, blocknum, false, EXTENSION_FAIL);
>  
>      seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE));
> @@ -571,7 +574,11 @@ mdread(SMgrRelation reln, ForkNumber for
>                   errmsg("could not seek to block %u of relation %s: %m",
>                          blocknum, relpath(reln->smgr_rnode, forknum))));
>  
> -    if ((nbytes = FileRead(v->mdfd_vfd, buffer, BLCKSZ)) != BLCKSZ)
> +    nbytes = FileRead(v->mdfd_vfd, buffer, BLCKSZ);
> +
> +    TRACE_POSTGRESQL_SMGR_MD_READ_DONE(forknum, blocknum, reln->smgr_rnode.spcNode, reln->smgr_rnode.dbNode,
reln->smgr_rnode.relNode,relpath(reln->smgr_rnode, forknum), nbytes, BLCKSZ);
 
> +
> +    if (nbytes != BLCKSZ)
>      {
>          if (nbytes < 0)
>              ereport(ERROR,
> @@ -618,6 +625,8 @@ mdwrite(SMgrRelation reln, ForkNumber fo
>      Assert(blocknum < mdnblocks(reln, forknum));
>  #endif
>  
> +    TRACE_POSTGRESQL_SMGR_MD_WRITE_START(forknum, blocknum, reln->smgr_rnode.spcNode, reln->smgr_rnode.dbNode,
reln->smgr_rnode.relNode);
> +
>      v = _mdfd_getseg(reln, forknum, blocknum, isTemp, EXTENSION_FAIL);
>  
>      seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE));
> @@ -629,7 +638,11 @@ mdwrite(SMgrRelation reln, ForkNumber fo
>                   errmsg("could not seek to block %u of relation %s: %m",
>                          blocknum, relpath(reln->smgr_rnode, forknum))));
>  
> -    if ((nbytes = FileWrite(v->mdfd_vfd, buffer, BLCKSZ)) != BLCKSZ)
> +    nbytes = FileWrite(v->mdfd_vfd, buffer, BLCKSZ);
> +
> +    TRACE_POSTGRESQL_SMGR_MD_WRITE_DONE(forknum, blocknum, reln->smgr_rnode.spcNode, reln->smgr_rnode.dbNode,
reln->smgr_rnode.relNode,relpath(reln->smgr_rnode, forknum), nbytes, BLCKSZ);
 
> +
> +    if (nbytes != BLCKSZ)
>      {
>          if (nbytes < 0)
>              ereport(ERROR,
> Index: src/backend/utils/Gen_dummy_probes.sed
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/utils/Gen_dummy_probes.sed,v
> retrieving revision 1.2
> diff -u -3 -p -r1.2 Gen_dummy_probes.sed
> --- src/backend/utils/Gen_dummy_probes.sed    1 Aug 2008 13:16:09 -0000    1.2
> +++ src/backend/utils/Gen_dummy_probes.sed    16 Dec 2008 19:46:13 -0000
> @@ -17,5 +17,7 @@ s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}
>  s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4)/
>  s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5)/
>  s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5,
INT6)/
> +s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3,
INT4,INT5, INT6, INT7)/
 
> +s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1,
INT2,INT3, INT4, INT5, INT6, INT7, INT8)/
 
>  P
>  s/(.*$/_ENABLED() (0)/
> Index: src/backend/utils/probes.d
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/utils/probes.d,v
> retrieving revision 1.3
> diff -u -3 -p -r1.3 probes.d
> --- src/backend/utils/probes.d    1 Aug 2008 13:16:09 -0000    1.3
> +++ src/backend/utils/probes.d    16 Dec 2008 19:46:13 -0000
> @@ -9,20 +9,19 @@
>  
>  
>  /* typedefs used in PostgreSQL */
> -typedef unsigned int LocalTransactionId;
> -typedef int LWLockId;
> -typedef int LWLockMode;
> -typedef int LOCKMODE;
> -typedef unsigned int BlockNumber;
> -typedef unsigned int Oid;
> -
> +#define LocalTransactionId unsigned int
> +#define LWLockId int
> +#define LWLockMode int
> +#define LOCKMODE int
> +#define BlockNumber unsigned int
> +#define Oid unsigned int
> +#define ForkNumber int
>  #define bool char
>  
>  provider postgresql {
>  
>      /* 
> -     * Due to a bug in Mac OS X 10.5, using built-in typedefs (e.g. uintptr_t,
> -     * uint32_t, etc.) cause compilation errors.  
> +     * Note: Do not use built-in typedefs (e.g. uintptr_t, uint32_t, etc)         *       as they cause compilation
errorsin Mac OS X 10.5.  
 
>       */
>        
>      probe transaction__start(LocalTransactionId);
> @@ -36,13 +35,8 @@ provider postgresql {
>      probe lwlock__condacquire(LWLockId, LWLockMode);
>      probe lwlock__condacquire__fail(LWLockId, LWLockMode);
>  
> -    /* The following probe declarations cause compilation errors
> -         * on Mac OS X but not on Solaris. Need further investigation.
> -     * probe lock__wait__start(unsigned int, LOCKMODE);
> -     * probe lock__wait__done(unsigned int, LOCKMODE);
> -     */
> -    probe lock__wait__start(unsigned int, int);
> -    probe lock__wait__done(unsigned int, int);
> +    probe lock__wait__start(unsigned int, LOCKMODE);
> +    probe lock__wait__done(unsigned int, LOCKMODE);
>  
>      probe query__parse__start(const char *);
>      probe query__parse__done(const char *);
> @@ -59,27 +53,26 @@ provider postgresql {
>      probe sort__start(int, bool, int, int, bool);
>      probe sort__done(unsigned long, long);
>  
> -    /* The following probe declarations cause compilation errors
> -         * on Mac OS X but not on Solaris. Need further investigation.
> -     * probe buffer__read__start(BlockNumber, Oid, Oid, Oid, bool);
> -     * probe buffer__read__done(BlockNumber, Oid, Oid, Oid, bool, bool);
> -     */
> -    probe buffer__read__start(unsigned int, unsigned int, unsigned int, unsigned int, bool);
> -    probe buffer__read__done(unsigned int, unsigned int, unsigned int, unsigned int, bool, bool);
> -
> +    probe buffer__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid, bool);
> +    probe buffer__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool);
>      probe buffer__flush__start(Oid, Oid, Oid);
>      probe buffer__flush__done(Oid, Oid, Oid);
>  
>      probe buffer__hit(bool);
>      probe buffer__miss(bool);
>      probe buffer__checkpoint__start(int);
> +    probe buffer__checkpoint__sync__start();
>      probe buffer__checkpoint__done();
>      probe buffer__sync__start(int, int);
>      probe buffer__sync__written(int);
>      probe buffer__sync__done(int, int, int);
> +    probe buffer__write__dirty__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
> +    probe buffer__write__dirty__done(ForkNumber, BlockNumber, Oid, Oid, Oid);
>  
>      probe deadlock__found();
>  
> +    probe checkpoint__start(int);
> +    probe checkpoint__done(int, int, int, int, int);
>      probe clog__checkpoint__start(bool);
>      probe clog__checkpoint__done(bool);
>      probe subtrans__checkpoint__start(bool);
> @@ -88,4 +81,14 @@ provider postgresql {
>      probe multixact__checkpoint__done(bool);
>      probe twophase__checkpoint__start();
>      probe twophase__checkpoint__done();
> +
> +    probe smgr__md__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
> +    probe smgr__md__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, const char *, int, int);
> +    probe smgr__md__write__start(ForkNumber, BlockNumber, Oid, Oid, Oid);
> +    probe smgr__md__write__done(ForkNumber, BlockNumber, Oid, Oid, Oid, const char *, int, int);
> +
> +    probe xlog__insert(unsigned char, unsigned char);
> +    probe xlog__switch();
> +    probe wal__buffer__write__start();
> +    probe wal__buffer__write__done();
>  };

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Variadic parameters vs parameter defaults
Next
From: Tom Lane
Date:
Subject: Re: Another issue in default-values patch: defaults expanded too soon