set test "postgres" # Test sdt support in postgres. Assumes a markered postgres is installed. ########## Create /tmp/stap-postgres.stp ########## set dpath "/tmp/stap-postgres.stp" set fp [open $dpath "w"] puts $fp " probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"transaction__start\") { printf(\"%s %#x\\n\", \$\$name, \$arg1); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"transaction__commit\") { printf(\"%s %#x\\n\", \$\$name, \$arg1); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"transaction__abort\") { printf(\"%s %#x\\n\", \$\$name, \$arg1); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"lock__startwait\") { printf(\"%s %#x %#x\\n\", \$\$name, \$arg1, \$arg2); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"lock__endwait\") { printf(\"%s %#x %#x\\n\", \$\$name, \$arg1, \$arg2); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"lwlock__endwait\") { printf(\"%s %#x %#x\\n\", \$\$name, \$arg1, \$arg2); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"lwlock__acquire\") { printf(\"%s %#x %#x\\n\", \$\$name, \$arg1, \$arg2); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"lwlock__condacquire__fail\") { printf(\"%s %#x %#x\\n\", \$\$name, \$arg1, \$arg2); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"lwlock__condacquire\") { printf(\"%s %#x %#x\\n\", \$\$name, \$arg1, \$arg2); } probe process(\"/usr/local/pgsql/bin/postgres\").mark(\"lwlock__release\") { printf(\"%s %#x\\n\", \$\$name, \$arg1); } " close $fp ########## Create /tmp/stap-postgres.sh ########## set dpath "/tmp/stap-postgres.sh" set fp [open $dpath "w"] puts $fp " if locate pg_regress_main.o ; then POSTGRESBUILD=\$(dirname \$(locate pg_regress_main.o)) else echo UNSUPPORTED: Directory does not exist: postgres-build-dir/src/test/regress exit fi if \[ -d /usr/local/pgsql \] ; then POSTGRESDIR=/usr/local/pgsql/bin else echo UNSUPPORTED: Directory does not exist /usr/local/pgsql exit fi \$POSTGRESDIR/initdb /tmp/stap-postgres if \[ \$(objdump -h \$POSTGRESDIR/postgres | grep probes | wc -l) -eq 0 \] ; then echo UNSUPPORTED: \$POSTGRESDIR/postgres does not contain probes exit fi PGDATA=/tmp/stap-postgres/ stap -c \"\$POSTGRESDIR/postgres -D /tmp/stap-postgres\" /tmp/stap-postgres.stp >/tmp/stap-postgres-markers.log 2>&1 & # wait until postgres is running I=0 while \[ \$I -ne 10 \] ; do if expr \$(ps --no-headers -C postgres | wc -l) > 0 then I=10 else sleep 5 I=\$\[\$I+1\] fi done cd \$POSTGRESBUILD/ make installcheck > /tmp/stap-postgres.log 2>&1 ACQUIRE=\$(grep 'lwlock__acquire 0x\[0-9\]* 0x\[0-9\]*' /tmp/stap-postgres-markers.log | wc -l) RELEASE=\$(grep 'lwlock__release 0x\[0-9\]*' /tmp/stap-postgres-markers.log | wc -l) START=\$(grep 'transaction__start 0x\[0-9\]*' /tmp/stap-postgres-markers.log | wc -l) COMMIT=\$(grep 'transaction__commit 0x\[0-9\]*' /tmp/stap-postgres-markers.log | wc -l) OKAY=\$(grep 'test .*ok' /tmp/stap-postgres.log | wc -l) echo lwlock__acquire=\$ACQUIRE lwlock__release=\$RELEASE transaction__start=\$START transaction__commit=\$COMMIT test-ok=\$OKAY : 44873 75325 591 489 0 if \[ \$ACQUIRE -gt 44000 -a \$RELEASE -gt 75000 -a \$START -gt 580 -a \$COMMIT -gt 480 \] ; then echo PASS: postgres markers else echo FAIL: postgres markers fi if \[ \$OKAY -gt 100 \] ; then echo PASS: postgres tests else echo FAIL: postgres tests fi kill \$(ps --no-headers -C postgres | head -1 | awk '{print \$1}') " close $fp ########## /tmp/stap-postgres.sh does most of the work ########## verbose -log Running postgres testsuite spawn sh /tmp/stap-postgres.sh 2>&1 expect { -timeout 180 -re {FAIL: [a-z_ ]+} { regexp " .*$" $expect_out(0,string) s; fail "$s"; exp_continue } -re {PASS: [a-z_ ]+} { regexp " .*$" $expect_out(0,string) s; pass "$s"; exp_continue } -re {UNSUPPORTED: [a-zA-Z_/: ]+} { regexp " .*$" $expect_out(0,string) s; verbose -log "$s" unsupported "$s"; exp_continue } timeout { fail "$test (timeout) } eof { } } Catch {exec rm -rf /tmp/stap-postgres} catch {exec rm /tmp/stap-postgres.stp /tmp/stap-postgres.log \ /tmp/stap-postgres-markers.log /tmp/stap-postgres.sh}