diff --git a/configure b/configure index af2bbe6a496724fbbfd4c768563712b5b31b436e..20084080c5abe813b9150953ad57b92f77452a39 100755 --- a/configure +++ b/configure @@ -314,7 +314,7 @@ ac_includes_default="\ # include <unistd.h> #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS configure_args build build_cpu build_vendor build_os host host_cpu host_vendor host_os PORTNAME docdir enable_nls WANTED_LANGUAGES default_port enable_shared enable_rpath enable_debug CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP GCC TAS autodepend INCLUDES enable_thread_safety with_tcl with_perl with_python with_krb5 krb_srvtab with_pam with_ldap with_bonjour with_openssl with_zlib EGREP ELF_SYS LDFLAGS_SL AWK FLEX FLEXFLAGS LN_S LD with_gnu_ld ld_R_works RANLIB ac_ct_RANLIB TAR STRIP ac_ct_STRIP STRIP_STATIC_LIB STRIP_SHARED_LIB YACC YFLAGS PERL perl_archlibexp perl_privlibexp perl_useshrplib perl_embed_ldflags PYTHON python_version python_configdir python_includespec python_libdir python_libspec python_additional_libs HAVE_IPV6 LIBOBJS acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS HAVE_POSIX_SIGNALS MSGFMT MSGMERGE XGETTEXT localedir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC TCL_LIB_FILE TCL_LIBS TCL_LIB_SPEC TCL_SHARED_BUILD TCL_SHLIB_LD_LIBS NSGMLS JADE have_docbook DOCBOOKSTYLE COLLATEINDEX SGMLSPL vpath_build LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS configure_args build build_cpu build_vendor build_os host host_cpu host_vendor host_os PORTNAME docdir enable_nls WANTED_LANGUAGES default_port enable_shared enable_rpath enable_debug DTRACE DTRACEFLAGS enable_dtrace CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP GCC TAS autodepend INCLUDES enable_thread_safety with_tcl with_perl with_python with_krb5 krb_srvtab with_pam with_ldap with_bonjour with_openssl with_zlib EGREP ELF_SYS LDFLAGS_SL AWK FLEX FLEXFLAGS LN_S LD with_gnu_ld ld_R_works RANLIB ac_ct_RANLIB TAR STRIP ac_ct_STRIP STRIP_STATIC_LIB STRIP_SHARED_LIB YACC YFLAGS PERL perl_archlibexp perl_privlibexp perl_useshrplib perl_embed_ldflags PYTHON python_version python_configdir python_includespec python_libdir python_libspec python_additional_libs HAVE_IPV6 LIBOBJS acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS HAVE_POSIX_SIGNALS MSGFMT MSGMERGE XGETTEXT localedir TCLSH TCL_CONFIG_SH TCL_INCLUDE_SPEC TCL_LIB_FILE TCL_LIBS TCL_LIB_SPEC TCL_SHARED_BUILD TCL_SHLIB_LD_LIBS NSGMLS JADE have_docbook DOCBOOKSTYLE COLLATEINDEX SGMLSPL vpath_build LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -865,6 +865,7 @@ Optional Features: --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 @@ -1946,6 +1947,82 @@ fi; +# +# 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_shared) ;; enable_rpath) ;; enable_spinlocks) ;; enable_debug) ;; +enable_dtrace) ;; with_CC) ;; enable_depend) ;; enable_cassert) ;; @@ -23431,6 +23509,9 @@ s,@default_port@,$default_port,;t t 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 --git a/configure.in b/configure.in index 03b8f51d641edeb2f78622af5c7ee365ced72b0a..fe3cde3f6a7ab36267fdb3cef10086aa35c0c511 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -dnl $PostgreSQL: pgsql/configure.in,v 1.468 2006/07/11 16:14:50 tgl Exp $ +dnl $PostgreSQL: pgsql/configure.in,v 1.469 2006/07/24 16:32:44 petere Exp $ dnl dnl Developers, please strive to achieve this order: dnl @@ -205,6 +205,17 @@ PGAC_ARG_BOOL(enable, debug, no, [ --enable-debug build with debugging symbols (-g)]) 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 --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index f2463d9b9edfa8f0d8f8410dd52628240f10221c..e7ed9b4d5ca10ae28ed93b4b9967f8c97247b9af 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.258 2006/06/18 15:38:35 petere Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.259 2006/07/24 16:32:44 petere Exp $ --> <chapter id="installation"> <title><![%standalone-include[<productname>PostgreSQL</>]]> @@ -1007,6 +1007,17 @@ su - postgres </listitem> </varlistentry> + <varlistentry> + <term><option>--enable-dtrace</option></term> + <listitem> + <para> + Compiles with support for the dynamic tracing tool DTrace. + Operating system support for DTrace is currently only + available in Solaris. + </para> + </listitem> + </varlistentry> + </variablelist> </para> diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 70c82bd314af4a8482685030b4389834a24936a0..c3066b2f1119ce5b5106887b9718be87b8c2b90d 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -1,5 +1,5 @@ # -*-makefile-*- -# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.224 2006/07/21 22:37:37 petere Exp $ +# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.225 2006/07/24 16:32:44 petere Exp $ #------------------------------------------------------------------------------ # All PostgreSQL makefiles include this file and use the variables it sets, @@ -157,6 +157,7 @@ enable_shared = @enable_shared@ 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 @@ YACC = @YACC@ YFLAGS = @YFLAGS@ FLEX = @FLEX@ FLEXFLAGS = @FLEXFLAGS@ $(LFLAGS) +DTRACE = @DTRACE@ +DTRACEFLAGS = @DTRACEFLAGS@ # Linking diff --git a/src/backend/Makefile b/src/backend/Makefile index 8908a5a7dbbd554fc5736913a7f04aad66f0db3f..12de33e4044e0c6681a2a766b5f0c6be69a3aa78 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -4,7 +4,7 @@ # # Copyright (c) 1994, Regents of the University of California # -# $PostgreSQL: pgsql/src/backend/Makefile,v 1.116 2006/06/22 23:50:35 tgl Exp $ +# $PostgreSQL: pgsql/src/backend/Makefile,v 1.117 2006/07/24 16:32:44 petere Exp $ # #------------------------------------------------------------------------- @@ -19,7 +19,11 @@ DIRS := access bootstrap catalog parser commands executor lib libpq \ SUBSYSOBJS := $(DIRS:%=%/SUBSYS.o) -OBJS := $(SUBSYSOBJS) $(top_builddir)/src/port/libpgport_srv.a +ifeq ($(enable_dtrace), yes) +LOCALOBJS += utils/probes.o +endif + +OBJS = $(SUBSYSOBJS) $(LOCALOBJS) $(top_builddir)/src/port/libpgport_srv.a # We put libpgport into OBJS, so remove it from LIBS LIBS := $(filter-out -lpgport, $(LIBS)) @@ -135,6 +139,10 @@ $(top_builddir)/src/include/utils/fmgroids.h: utils/fmgroids.h $(LN_S) ../../../$(subdir)/utils/fmgroids.h . +utils/probes.o: utils/probes.d $(SUBSYSOBJS) + $(DTRACE) $(DTRACEFLAGS) -G -s $^ + + ########################################################################## distprep: @@ -220,7 +228,7 @@ endif ########################################################################## clean: - rm -f postgres$(X) $(POSTGRES_IMP) \ + rm -f $(LOCALOBJS) postgres$(X) $(POSTGRES_IMP) \ $(top_srcdir)/src/include/parser/parse.h \ $(top_builddir)/src/include/utils/fmgroids.h ifeq ($(PORTNAME), cygwin) diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 2694f24c37dbab4d711f5c6e71f2ba83af0ef4ce..e9473acaa6bd08db9abfc84d6cc686c4025f4f47 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.223 2006/07/14 14:52:17 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.224 2006/07/24 16:32:44 petere Exp $ * *------------------------------------------------------------------------- */ @@ -1384,6 +1384,8 @@ StartTransaction(void) 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 @@ CommitTransaction(void) 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 @@ AbortTransaction(void) LWLockRelease(ProcArrayLock); } + PG_TRACE1 (transaction__abort, s->transactionId); + /* * Post-abort cleanup. See notes in CommitTransaction() concerning * ordering. diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index 2b3a4c63c4f483134dd9771f525f50cc304d0c6e..a0bc2869c00c746b40e226b6768ef8d986cbb336 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.168 2006/07/23 23:08:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.169 2006/07/24 16:32:45 petere Exp $ * * NOTES * A lock table is a shared memory hash table. When @@ -796,8 +796,13 @@ LockAcquire(const LOCKTAG *locktag, /* * 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 --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 077bec4a60f5f04fd33dddc9ef71f0df0469dc35..f10de0dca0e5350f657b9d0f78949d625a1c9c34 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -15,7 +15,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/lmgr/lwlock.c,v 1.41 2006/07/23 03:07:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/storage/lmgr/lwlock.c,v 1.42 2006/07/24 16:32:45 petere Exp $ * *------------------------------------------------------------------------- */ @@ -420,6 +420,8 @@ LWLockAcquire(LWLockId lockid, LWLockMode mode) block_counts[lockid]++; #endif + PG_TRACE2(lwlock__startwait, lockid, mode); + for (;;) { /* "false" means cannot accept cancel/die interrupt here. */ @@ -429,6 +431,8 @@ LWLockAcquire(LWLockId lockid, LWLockMode mode) extraWaits++; } + PG_TRACE2(lwlock__endwait, lockid, mode); + LOG_LWDEBUG("LWLockAcquire", lockid, "awakened"); /* Now loop back and try to acquire lock again. */ @@ -438,6 +442,8 @@ LWLockAcquire(LWLockId lockid, LWLockMode mode) /* 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; @@ -507,11 +513,13 @@ LWLockConditionalAcquire(LWLockId lockid, LWLockMode mode) /* 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; @@ -596,6 +604,8 @@ LWLockRelease(LWLockId lockid) /* 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 --git a/src/backend/utils/probes.d b/src/backend/utils/probes.d new file mode 100644 index 0000000000000000000000000000000000000000..2720de8cd93fbe52aab833dd9b5cf3621b86b2ef --- /dev/null +++ b/src/backend/utils/probes.d @@ -0,0 +1,24 @@ +/* ---------- + * DTrace probes for PostgreSQL backend + * + * Copyright (c) 2006, PostgreSQL Global Development Group + * + * $PostgreSQL: pgsql/src/backend/utils/probes.d,v 1.1 2006/07/24 16:32:45 petere Exp $ + * ---------- + */ + +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 --git a/src/include/c.h b/src/include/c.h index bd09a430edc4ed67f6739a1bffa4c9f3dde4fe57..5195db2ac755bb7cce9e0f7a8ab32c226fff06cd 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -12,7 +12,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/c.h,v 1.206 2006/07/06 01:55:51 momjian Exp $ + * $PostgreSQL: pgsql/src/include/c.h,v 1.207 2006/07/24 16:32:45 petere Exp $ * *------------------------------------------------------------------------- */ @@ -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 --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 82ccde63c1c2f7b8cf45c493415be6200376b5ae..e84205c9ea08892d8d90f9707658efe3960b978d 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -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 --git a/src/include/pg_trace.h b/src/include/pg_trace.h new file mode 100644 index 0000000000000000000000000000000000000000..6c35cb2e8ddd3924c2d9cafcaa5962954cd44120 --- /dev/null +++ b/src/include/pg_trace.h @@ -0,0 +1,56 @@ +/* ---------- + * pg_trace.h + * + * Definitions for the PostgreSQL tracing framework + * + * Copyright (c) 2006, PostgreSQL Global Development Group + * + * $PostgreSQL: pgsql/src/include/pg_trace.h,v 1.1 2006/07/24 16:32:45 petere Exp $ + * ---------- + */ + +#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 */