Re: [PATCHES] Generic Monitoring Framework with DTrace patch - Mailing list pgsql-hackers

From Robert Lor
Subject Re: [PATCHES] Generic Monitoring Framework with DTrace patch
Date
Msg-id 44C19D43.6040809@sun.com
Whole thread Raw
List pgsql-hackers
Peter, I'll test the patch on Solaris.  Thanks!

Regards,
-Robert


Peter Eisentraut wrote:

>Here is a consolidated patch that contains all the files.  I made some
>configure and makefile adjustments and put standard comment headers in
>all the files.  You can use DTRACEFLAGS to pass options to configure,
>which should help sorting out the 32/64-bit issue.  The problem of the
>*.d files is already gone in CVS.
>
>Since I don't have access to a Solaris system, this is untested for the
>DTrace-enabled case.  The only thing left to do besides actually
>testing that case would be moving the probes.d file to a different
>location, since we probably don't want to have special-purpose files in
>src/backend.
>
>
>
>------------------------------------------------------------------------
>
>diff -uNr ../cvs-pgsql/configure ./configure
>--- ../cvs-pgsql/configure    2006-07-21 23:35:48.000000000 +0200
>+++ ./configure    2006-07-22 01:21:54.000000000 +0200
>@@ -314,7 +314,7 @@
> # include <unistd.h>
> #endif"
>
>-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT
exec_prefixprefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir
libdirincludedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS
configure_argsbuild build_cpu build_vendor build_os host host_cpu host_vendor host_os PORTNAME docdir enable_nls
WANTED_LANGUAGESdefault_port enable_shared enable_rpath enable_debug CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT
CPPGCC TAS autodepend INCLUDES enable_thread_safety with_tcl with_perl with_python with_krb5 krb_srvtab with_pam
with_ldapwith_bonjour with_openssl with_zlib EGREP ELF_SYS LDFLAGS_SL AWK FLEX FLEXFLAGS LN_S LD with_gnu_ld ld_R_works
RANLIBac_ct_RANLIB TAR STRIP ac_ct_STRIP STRIP_STATIC_LIB STRIP_SHARED_LIB YACC YFLAGS PERL perl_archlibexp
perl_privlibexpperl_useshrplib perl_embed_ldflags PYTHON python_version python_configdir python_includespec
python_libdirpython_libspec python_additional_libs HAVE_IPV6 LIBOBJS acx_pthread_config PTHREAD_CC PTHREAD_LIBS
PTHREAD_CFLAGSHAVE_POSIX_SIGNALS MSGFMT MSGMERGE XGETTEXT localedir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC TCL_LIB_FILE
TCL_LIBSTCL_LIB_SPEC TCL_SHARED_BUILD TCL_SHLIB_LD_LIBS NSGMLS JADE have_docbook DOCBOOKSTYLE COLLATEINDEX SGMLSPL
vpath_buildLTLIBOBJS' 
>+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT
exec_prefixprefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir
libdirincludedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS
configure_argsbuild build_cpu build_vendor build_os host host_cpu host_vendor host_os PORTNAME docdir enable_nls
WANTED_LANGUAGESdefault_port enable_shared enable_rpath enable_debug DTRACE DTRACEFLAGS enable_dtrace CC CFLAGS LDFLAGS
CPPFLAGSac_ct_CC EXEEXT OBJEXT CPP GCC TAS autodepend INCLUDES enable_thread_safety with_tcl with_perl with_python
with_krb5krb_srvtab with_pam with_ldap with_bonjour with_openssl with_zlib EGREP ELF_SYS LDFLAGS_SL AWK FLEX FLEXFLAGS
LN_SLD with_gnu_ld ld_R_works RANLIB ac_ct_RANLIB TAR STRIP ac_ct_STRIP STRIP_STATIC_LIB STRIP_SHARED_LIB YACC YFLAGS
PERLperl_archlibexp perl_privlibexp perl_useshrplib perl_embed_ldflags PYTHON python_version python_configdir
python_includespecpython_libdir python_libspec python_additional_libs HAVE_IPV6 LIBOBJS acx_pthread_config PTHREAD_CC
PTHREAD_LIBSPTHREAD_CFLAGS HAVE_POSIX_SIGNALS MSGFMT MSGMERGE XGETTEXT localedir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC
TCL_LIB_FILETCL_LIBS TCL_LIB_SPEC TCL_SHARED_BUILD TCL_SHLIB_LD_LIBS NSGMLS JADE have_docbook DOCBOOKSTYLE COLLATEINDEX
SGMLSPLvpath_build LTLIBOBJS' 
> ac_subst_files=''
>
> # Initialize some variables set by options.
>@@ -865,6 +865,7 @@
>   --disable-rpath         do not embed shared library search path in executables
>   --disable-spinlocks     do not use spinlocks
>   --enable-debug          build with debugging symbols (-g)
>+  --enable-dtrace         build with DTrace support
>   --enable-depend         turn on automatic dependency tracking
>   --enable-cassert        enable assertion checks (for debugging)
>   --enable-thread-safety  make client libraries thread-safe
>@@ -1947,6 +1948,82 @@
>
>
> #
>+# DTrace
>+#
>+
>+
>+
>+# Check whether --enable-dtrace or --disable-dtrace was given.
>+if test "${enable_dtrace+set}" = set; then
>+  enableval="$enable_dtrace"
>+
>+  case $enableval in
>+    yes)
>+
>+cat >>confdefs.h <<\_ACEOF
>+#define ENABLE_DTRACE 1
>+_ACEOF
>+
>+for ac_prog in dtrace
>+do
>+  # Extract the first word of "$ac_prog", so it can be a program name with args.
>+set dummy $ac_prog; ac_word=$2
>+echo "$as_me:$LINENO: checking for $ac_word" >&5
>+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
>+if test "${ac_cv_prog_DTRACE+set}" = set; then
>+  echo $ECHO_N "(cached) $ECHO_C" >&6
>+else
>+  if test -n "$DTRACE"; then
>+  ac_cv_prog_DTRACE="$DTRACE" # Let the user override the test.
>+else
>+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
>+for as_dir in $PATH
>+do
>+  IFS=$as_save_IFS
>+  test -z "$as_dir" && as_dir=.
>+  for ac_exec_ext in '' $ac_executable_extensions; do
>+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
>+    ac_cv_prog_DTRACE="$ac_prog"
>+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
>+    break 2
>+  fi
>+done
>+done
>+
>+fi
>+fi
>+DTRACE=$ac_cv_prog_DTRACE
>+if test -n "$DTRACE"; then
>+  echo "$as_me:$LINENO: result: $DTRACE" >&5
>+echo "${ECHO_T}$DTRACE" >&6
>+else
>+  echo "$as_me:$LINENO: result: no" >&5
>+echo "${ECHO_T}no" >&6
>+fi
>+
>+  test -n "$DTRACE" && break
>+done
>+
>+
>+      ;;
>+    no)
>+      :
>+      ;;
>+    *)
>+      { { echo "$as_me:$LINENO: error: no argument expected for --enable-dtrace option" >&5
>+echo "$as_me: error: no argument expected for --enable-dtrace option" >&2;}
>+   { (exit 1); exit 1; }; }
>+      ;;
>+  esac
>+
>+else
>+  enable_dtrace=no
>+
>+fi;
>+
>+
>+
>+#
> # C compiler
> #
>
>@@ -22759,6 +22836,7 @@
> enable_rpath) ;;
> enable_spinlocks) ;;
> enable_debug) ;;
>+enable_dtrace) ;;
> with_CC) ;;
> enable_depend) ;;
> enable_cassert) ;;
>@@ -23431,6 +23509,9 @@
> s,@enable_shared@,$enable_shared,;t t
> s,@enable_rpath@,$enable_rpath,;t t
> s,@enable_debug@,$enable_debug,;t t
>+s,@DTRACE@,$DTRACE,;t t
>+s,@DTRACEFLAGS@,$DTRACEFLAGS,;t t
>+s,@enable_dtrace@,$enable_dtrace,;t t
> s,@CC@,$CC,;t t
> s,@CFLAGS@,$CFLAGS,;t t
> s,@LDFLAGS@,$LDFLAGS,;t t
>diff -uNr ../cvs-pgsql/configure.in ./configure.in
>--- ../cvs-pgsql/configure.in    2006-07-21 23:35:48.000000000 +0200
>+++ ./configure.in    2006-07-22 01:09:54.000000000 +0200
>@@ -206,6 +206,17 @@
> AC_SUBST(enable_debug)
>
> #
>+# DTrace
>+#
>+PGAC_ARG_BOOL(enable, dtrace, no,
>+              [  --enable-dtrace         build with DTrace support],
>+[AC_DEFINE([ENABLE_DTRACE], 1,
>+           [Define to 1 to enable DTrace support. (--enable-dtrace)])
>+AC_CHECK_PROGS(DTRACE, dtrace)
>+AC_SUBST(DTRACEFLAGS)])
>+AC_SUBST(enable_dtrace)
>+
>+#
> # C compiler
> #
>
>diff -uNr ../cvs-pgsql/src/backend/access/transam/xact.c ./src/backend/access/transam/xact.c
>--- ../cvs-pgsql/src/backend/access/transam/xact.c    2006-07-21 23:36:01.000000000 +0200
>+++ ./src/backend/access/transam/xact.c    2006-07-22 00:46:42.000000000 +0200
>@@ -1384,6 +1384,8 @@
>
>     XactLockTableInsert(s->transactionId);
>
>+    PG_TRACE1 (transaction__start, s->transactionId);
>+
>     /*
>      * set transaction_timestamp() (a/k/a now()).  We want this to be the
>      * same as the first command's statement_timestamp(), so don't do a
>@@ -1535,6 +1537,8 @@
>         LWLockRelease(ProcArrayLock);
>     }
>
>+    PG_TRACE1 (transaction__commit, s->transactionId);
>+
>     /*
>      * This is all post-commit cleanup.  Note that if an error is raised here,
>      * it's too late to abort the transaction.  This should be just
>@@ -1931,6 +1935,8 @@
>         LWLockRelease(ProcArrayLock);
>     }
>
>+    PG_TRACE1 (transaction__abort, s->transactionId);
>+
>     /*
>      * Post-abort cleanup.    See notes in CommitTransaction() concerning
>      * ordering.
>diff -uNr ../cvs-pgsql/src/backend/Makefile ./src/backend/Makefile
>--- ../cvs-pgsql/src/backend/Makefile    2006-07-21 23:36:00.000000000 +0200
>+++ ./src/backend/Makefile    2006-07-22 01:21:06.000000000 +0200
>@@ -19,7 +19,11 @@
>
> SUBSYSOBJS := $(DIRS:%=%/SUBSYS.o)
>
>-OBJS := $(SUBSYSOBJS) $(top_builddir)/src/port/libpgport_srv.a
>+OBJS = $(SUBSYSOBJS) $(top_builddir)/src/port/libpgport_srv.a
>+
>+ifeq ($(enable_dtrace), yes)
>+OBJS += probes.o
>+endif
>
> # We put libpgport into OBJS, so remove it from LIBS
> LIBS := $(filter-out -lpgport, $(LIBS))
>@@ -135,6 +139,10 @@
>         $(LN_S) ../../../$(subdir)/utils/fmgroids.h .
>
>
>+probes.o: probes.d $(SUBSYSOBJS)
>+    $(DTRACE) $(DTRACEFLAGS) -G -s $^
>+
>+
> ##########################################################################
>
> distprep:
>diff -uNr ../cvs-pgsql/src/backend/probes.d ./src/backend/probes.d
>--- ../cvs-pgsql/src/backend/probes.d    1970-01-01 01:00:00.000000000 +0100
>+++ ./src/backend/probes.d    2006-07-22 01:17:59.000000000 +0200
>@@ -0,0 +1,24 @@
>+/* ----------
>+ *    DTrace probes for PostgreSQL backend
>+ *
>+ *    Copyright (c) 2006, PostgreSQL Global Development Group
>+ *
>+ *    $PostgreSQL$
>+ * ----------
>+ */
>+
>+provider postgresql {
>+
>+probe transaction__start(int);
>+probe transaction__commit(int);
>+probe transaction__abort(int);
>+probe lwlock__acquire(int, int);
>+probe lwlock__release(int);
>+probe lwlock__startwait(int, int);
>+probe lwlock__endwait(int, int);
>+probe lwlock__condacquire(int, int);
>+probe lwlock__condacquire__fail(int, int);
>+probe lock__startwait(int, int);
>+probe lock__endwait(int, int);
>+
>+};
>diff -uNr ../cvs-pgsql/src/backend/storage/lmgr/lock.c ./src/backend/storage/lmgr/lock.c
>--- ../cvs-pgsql/src/backend/storage/lmgr/lock.c    2006-07-21 23:36:08.000000000 +0200
>+++ ./src/backend/storage/lmgr/lock.c    2006-07-22 00:49:47.000000000 +0200
>@@ -752,8 +752,13 @@
>         /*
>          * Sleep till someone wakes me up.
>          */
>+
>+        PG_TRACE2(lock__startwait, locktag->locktag_field2, lockmode);
>+
>         WaitOnLock(locallock, owner);
>
>+        PG_TRACE2(lock__endwait, locktag->locktag_field2, lockmode);
>+
>         /*
>          * NOTE: do not do any material change of state between here and
>          * return.    All required changes in locktable state must have been
>diff -uNr ../cvs-pgsql/src/backend/storage/lmgr/lwlock.c ./src/backend/storage/lmgr/lwlock.c
>--- ../cvs-pgsql/src/backend/storage/lmgr/lwlock.c    2006-07-21 23:36:08.000000000 +0200
>+++ ./src/backend/storage/lmgr/lwlock.c    2006-07-22 00:50:23.000000000 +0200
>@@ -424,6 +424,8 @@
>         block_counts[lockid]++;
> #endif
>
>+        PG_TRACE2(lwlock__startwait, lockid, mode);
>+
>         for (;;)
>         {
>             /* "false" means cannot accept cancel/die interrupt here. */
>@@ -433,6 +435,8 @@
>             extraWaits++;
>         }
>
>+        PG_TRACE2(lwlock__endwait, lockid, mode);
>+
>         LOG_LWDEBUG("LWLockAcquire", lockid, "awakened");
>
>         /* Now loop back and try to acquire lock again. */
>@@ -442,6 +446,8 @@
>     /* We are done updating shared state of the lock itself. */
>     SpinLockRelease(&lock->mutex);
>
>+    PG_TRACE2(lwlock__acquire, lockid, mode);
>+
>     /* Add lock to list of locks held by this backend */
>     held_lwlocks[num_held_lwlocks++] = lockid;
>
>@@ -511,11 +517,13 @@
>         /* Failed to get lock, so release interrupt holdoff */
>         RESUME_INTERRUPTS();
>         LOG_LWDEBUG("LWLockConditionalAcquire", lockid, "failed");
>+        PG_TRACE2(lwlock__condacquire__fail, lockid, mode);
>     }
>     else
>     {
>         /* Add lock to list of locks held by this backend */
>         held_lwlocks[num_held_lwlocks++] = lockid;
>+        PG_TRACE2(lwlock__condacquire, lockid, mode);
>     }
>
>     return !mustwait;
>@@ -600,6 +608,8 @@
>     /* We are done updating shared state of the lock itself. */
>     SpinLockRelease(&lock->mutex);
>
>+    PG_TRACE1(lwlock__release, lockid);
>+
>     /*
>      * Awaken any waiters I removed from the queue.
>      */
>diff -uNr ../cvs-pgsql/src/include/c.h ./src/include/c.h
>--- ../cvs-pgsql/src/include/c.h    2006-07-21 23:36:15.000000000 +0200
>+++ ./src/include/c.h    2006-07-22 00:46:42.000000000 +0200
>@@ -56,6 +56,7 @@
> #include "pg_config_os.h"        /* must be before any system header files */
> #endif
> #include "postgres_ext.h"
>+#include "pg_trace.h"
>
> #if defined(_MSC_VER) || defined(__BORLANDC__)
> #define    WIN32_ONLY_COMPILER
>diff -uNr ../cvs-pgsql/src/include/pg_config.h.in ./src/include/pg_config.h.in
>--- ../cvs-pgsql/src/include/pg_config.h.in    2006-07-21 23:36:15.000000000 +0200
>+++ ./src/include/pg_config.h.in    2006-07-22 00:46:42.000000000 +0200
>@@ -36,6 +36,9 @@
> /* Define to the default TCP port number as a string constant. */
> #undef DEF_PGPORT_STR
>
>+/* Define to 1 to enable DTrace support. (--enable-dtrace) */
>+#undef ENABLE_DTRACE
>+
> /* Define to 1 if you want National Language Support. (--enable-nls) */
> #undef ENABLE_NLS
>
>diff -uNr ../cvs-pgsql/src/include/pg_trace.h ./src/include/pg_trace.h
>--- ../cvs-pgsql/src/include/pg_trace.h    1970-01-01 01:00:00.000000000 +0100
>+++ ./src/include/pg_trace.h    2006-07-22 00:54:22.000000000 +0200
>@@ -0,0 +1,56 @@
>+/* ----------
>+ *    pg_trace.h
>+ *
>+ *    Definitions for the PostgreSQL tracing framework
>+ *
>+ *    Copyright (c) 2006, PostgreSQL Global Development Group
>+ *
>+ *    $PostgreSQL$
>+ * ----------
>+ */
>+
>+#ifndef PG_TRACE_H
>+#define PG_TRACE_H
>+
>+#ifdef ENABLE_DTRACE
>+
>+#include <sys/sdt.h>
>+
>+/*
>+ * The PG_TRACE macros are mapped to the appropriate macros used by DTrace.
>+ *
>+ * Only one DTrace provider called "postgresql" will be used for PostgreSQL,
>+ * so the name is hard-coded here to avoid having to specify it in the
>+ * source code.
>+ */
>+
>+#define PG_TRACE(name) \
>+    DTRACE_PROBE(postgresql, name)
>+#define PG_TRACE1(name, arg1) \
>+    DTRACE_PROBE1(postgresql, name, arg1)
>+#define PG_TRACE2(name, arg1, arg2) \
>+    DTRACE_PROBE2(postgresql, name, arg1, arg2)
>+#define PG_TRACE3(name, arg1, arg2, arg3) \
>+    DTRACE_PROBE3(postgresql, name, arg1, arg2, arg3)
>+#define PG_TRACE4(name, arg1, arg2, arg3, arg4) \
>+    DTRACE_PROBE4(postgresql, name, arg1, arg2, arg3, arg4)
>+#define PG_TRACE5(name, arg1, arg2, arg3, arg4, arg5) \
>+    DTRACE_PROBE5(postgresql, name, arg1, arg2, arg3, arg4, arg5)
>+
>+#else /* not ENABLE_DTRACE */
>+
>+/*
>+ * Unless DTrace is explicitly enabled with --enable-dtrace, the PG_TRACE
>+ * macros will expand to no-ops.
>+ */
>+
>+#define PG_TRACE(name)
>+#define PG_TRACE1(name, arg1)
>+#define PG_TRACE2(name, arg1, arg2)
>+#define PG_TRACE3(name, arg1, arg2, arg3)
>+#define PG_TRACE4(name, arg1, arg2, arg3, arg4)
>+#define PG_TRACE5(name, arg1, arg2, arg3, arg4, arg5)
>+
>+#endif /* not ENABLE_DTRACE */
>+
>+#endif /* PG_TRACE_H */
>diff -uNr ../cvs-pgsql/src/Makefile.global.in ./src/Makefile.global.in
>--- ../cvs-pgsql/src/Makefile.global.in    2006-07-22 00:37:37.000000000 +0200
>+++ ./src/Makefile.global.in    2006-07-22 01:09:53.000000000 +0200
>@@ -157,6 +157,7 @@
> enable_rpath    = @enable_rpath@
> enable_nls    = @enable_nls@
> enable_debug    = @enable_debug@
>+enable_dtrace    = @enable_dtrace@
> enable_thread_safety    = @enable_thread_safety@
>
> python_includespec    = @python_includespec@
>@@ -212,6 +213,8 @@
> YFLAGS = @YFLAGS@
> FLEX = @FLEX@
> FLEXFLAGS = @FLEXFLAGS@ $(LFLAGS)
>+DTRACE = @DTRACE@
>+DTRACEFLAGS = @DTRACEFLAGS@
>
> # Linking
>
>
>




pgsql-hackers by date:

Previous
From: Robert Lor
Date:
Subject: Re: [PATCHES] Generic Monitoring Framework with DTrace patch
Next
From: Tom Lane
Date:
Subject: Re: [COMMITTERS] pgsql: Ah, I finally realize why Magnus