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: