This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

java stapbm: handle auto deletion of old files


Hello.

I'm tempted to rewrite /usr/libexec/systemtap/stapbm using C language for
faster processing, smaller memory footprint and robust error handling. ;-)

But here is a suggestion for

  # XXX: Erase file to keep it from sticking around indefinitely,
  # in case process ends, machine reboots, pid gets reused

part without rewriting.

Currently you are embedding output of hostname command into filename.
But under what environment will that be helpful? Virtual hosts where
hostname differs each other? To me, sharing writable $flagdir between
hosts sounds like asking for troubles. If no usecase, I think we can
remove it (and I removed it in the patch below).

Also, what are two

  pkglibexecdir=`eval echo $pkglibexecdir`

lines for? When do these lines make sense?

By the way, I'm waiting for your comment regarding
https://sourceware.org/ml/systemtap/2017-q3/msg00230.html .

----------------------------------------
>From 0223d184146c1fa3c2828fdf6ab25f75dad3e67c Mon Sep 17 00:00:00 2001
From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Date: Mon, 23 Oct 2017 15:39:06 +0900
Subject: [PATCH] java stapbm: handle auto deletion of old files

Linux has /proc/sys/kernel/random/boot_id interface which is determined
at boot time. Since this ID is unlikely same for each boot, we can use
this ID for detecting whether a system has restarted or not.

Linux has starttime field in /proc/$pid/stat interface which is determined
at process creation time. Since this stamp is unlikely same when PID is
reused, we can use this ID for detecting whether PID is reused or not.
(Be careful when parsing that field, for comm field might include spaces
and/or parentheses.)

Thus, change the lock file from `hostname`-${target_pid}-bm to
${boot_id}-${target_pid}-${start_time}-bm and automatically delete old
lock files when system restart or PID reuse is detected when a Byteman
agent is installed.

We can delete rule files from filesystem as soon as we hold a file
descriptor of the rule file, for we can specify /proc/$pid/fd/ interface
for rule files which will be automatically disappear when byteman-submit
completes. In case stapbm was unexpectedly terminated between creating
and deleting a rule file, change the rule file from `hostname`-$$.btm to
${boot_id}-${target_pid}-${start_time}-$$.btm so that old rule files
will be automatically deleted as with old lock files.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
---
 java/stapbm.in | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/java/stapbm.in b/java/stapbm.in
index f483d20..e520828 100755
--- a/java/stapbm.in
+++ b/java/stapbm.in
@@ -146,7 +146,9 @@ fi
 # JVM is ready for further bytemanning without a prior setup step,
 # and include in it the designated byteman agent listening-port number.
 #
-byteman_installed_portfile=$flagdir/`hostname`-${target_pid}-bm
+read boot_id < /proc/sys/kernel/random/boot_id
+start_time=`awk -F ')' ' { split($NF, array, " "); print array[20]; } ' /proc/${target_pid}/stat`
+byteman_installed_portfile=$flagdir/${boot_id}-${target_pid}-${start_time}-bm
 
 exec 200>>$byteman_installed_portfile # open/create lock file
 flock -x 200  # exclusive-lock it
@@ -188,10 +190,9 @@ else
     if [ "$SYSTEMTAP_VERBOSE" != "0" ]; then
         echo "Byteman agent installed for java pid $target_pid, port $bmport"
     fi
-    # XXX: Erase file to keep it from sticking around indefinitely,
-    # in case process ends, machine reboots, pid gets reused
-    # XXX: consider explicit notification to stapbm via process("java").begin/end ?
-    # ... or else: liveness-check below
+    # Erase file to keep it from sticking around indefinitely,
+    # in case process ends, machine reboots, pid gets reused.
+    find -- $flagdir/ -maxdepth 1 -type f \( -name '*-bm' -o -name '*.btm' \) \( ! -name ${boot_id}'-*' -o \( -name ${boot_id}'-'${target_pid}'-*' ! -name ${boot_id}'-'${target_pid}'-'${start_time}'-*' \) \) -print0 | xargs -0r rm -f --
 fi
 exec 200>&-   # close file & release flock
 
@@ -245,13 +246,14 @@ function echo_bytemanrule()
 
 
 # Generate the byteman rule file on-the-fly
-btmfile=$flagdir/`hostname`-$$.btm
-echo_bytemanrule > $btmfile
-trap 'rm -f $btmfile' 0 1 2 3 4 5 9 15
+btmfile=$flagdir/${boot_id}-${target_pid}-${start_time}-$$.btm
+exec 201>$btmfile # open/create rule file
+rm -f $btmfile
+echo_bytemanrule >&201
 
 if [ "$SYSTEMTAP_VERBOSE" != "0" ]; then
     echo "Byteman rule file:"
-    cat $btmfile
+    cat /proc/$$/fd/201
 fi
 
 if [ $mode = "uninstall" ]; then
@@ -261,7 +263,7 @@ else
 fi
 
 if [ "$SYSTEMTAP_VERBOSE" != "0" ]; then
-    echo java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd $btmfile
+    echo java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd /proc/$$/fd/201
 fi
 
-exec java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd $btmfile
+exec java -classpath ${BYTEMAN_SUBMIT_JAR}:${BYTEMAN_JAR}:${HELPERSDT_JAR} org.jboss.byteman.agent.submit.Submit -p $bmport $bmcmd /proc/$$/fd/201
-- 
1.8.3.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]