summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2024-11-30 14:16:21 -0800
committerVito Caputo <vcaputo@pengaru.com>2024-11-30 14:16:21 -0800
commit0e04a75e828f8a336d361303e68775d2603945e4 (patch)
treec93b752768014d27d21325d724fe7908d485e17c /src
parent73367b12eda9bed587882ad8ec9cc6875a4c2bbc (diff)
libvmon: assume stale threads in a stale process
The charts code in vwm/vmon assumes stale descendants of a stale node, but there seems to be some theoretical potential for that to not hold true. Let's be more agressive about ensuring that's the case. The current code already does this style propagation for stale processes, but not for threads. It seems like it'd be weird to have this happen, but maybe there's edge cases where you have a parent process exit with grandchildren threads surviving until a later sample, creating opportunity for a inconsistency.
Diffstat (limited to 'src')
-rw-r--r--src/libvmon/vmon.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/libvmon/vmon.c b/src/libvmon/vmon.c
index 4396b11..4ce0974 100644
--- a/src/libvmon/vmon.c
+++ b/src/libvmon/vmon.c
@@ -548,6 +548,22 @@ static int proc_follow_threads(vmon_t *vmon, vmon_proc_t *proc, vmon_proc_follow
vmon_proc_unmonitor(vmon, tmp, NULL, NULL);
}
+ /* If proc is stale, assume all the threads are stale as well. In vwm/charts.c we assume all descendants of a stale node
+ * are implicitly stale, so let's ensure that's a consistent assumumption WRT libvmon's maintenance of the hierarchy.
+ * The readdir below seems like it would't find any threads of a stale process, but maybe there's some potential for a race there,
+ * particularly since we reuse an open reference on the task_dir.
+ * This reflects a similar implicit is_stale propagation in follow_children.
+ */
+ if (proc->is_stale) {
+ list_for_each_entry(tmp, &proc->threads, threads)
+ tmp->is_stale = 1;
+
+ /* FIXME: the changes count seems to be unused here, so this currently always returns SAMPLE_UNCHANGED, and
+ * it's unclear to me if that was intentional or just never finished.
+ */
+ return SAMPLE_UNCHANGED;
+ }
+
start = &proc->threads;
while ((dentry = readdir((*store)->task_dir))) {
int tid;
© All Rights Reserved