From 0ea70c7fda4021cb9e35a0d4e26a30dd97409ddb Mon Sep 17 00:00:00 2001 From: Sourav Sharma Date: Wed, 4 Feb 2026 13:13:13 +0000 Subject: [PATCH 01/31] Introduces numa_maps metrics inside linux_proc pmda Implemented option -p in pcp numastat tool same as numactl numastat tool - Add new per-process NUMA maps metrics derived from /proc//numa_maps: proc.numa_maps.huge, proc.numa_maps.heap, proc.numa_maps.stack, proc.numa_maps.private (per-node usage in MB, exported as nodeN: pairs). - Extend pcp numastat/pcp-numastat with -p/--process to display per-process NUMA memory usage in a numastat -p-style layout. - Convert N= counts to MB using system page size (and Hugepagesize where applicable, with fallback). How to Test - pcp numastat -p (detail view) and pcp numastat -p (summary view) Signed-off-by: Sourav Sharma --- qa/743 | 24 +- qa/743.out | 723 +++++++++++++++++------ qa/archives/GNUmakefile | 4 +- qa/archives/mk.numa | 6 +- qa/archives/numa.0.xz | Bin 7020 -> 6484 bytes qa/archives/numa.index.xz | Bin 152 -> 192 bytes qa/archives/numa.meta.xz | Bin 6292 -> 7960 bytes qa/archives/pcp-numastat-1-node.0.xz | Bin 2020 -> 0 bytes qa/archives/pcp-numastat-1-node.index.xz | Bin 144 -> 0 bytes qa/archives/pcp-numastat-1-node.meta.xz | Bin 4964 -> 0 bytes qa/archives/pcp-numastat-8-node.0.xz | Bin 0 -> 51760 bytes qa/archives/pcp-numastat-8-node.index.xz | Bin 0 -> 240 bytes qa/archives/pcp-numastat-8-node.meta.xz | Bin 0 -> 33064 bytes src/pcp/numastat/pcp-numastat.1 | 23 +- src/pcp/numastat/pcp-numastat.py | 573 +++++++++++++++++- src/pmdas/linux_proc/clusters.h | 3 +- src/pmdas/linux_proc/help | 14 +- src/pmdas/linux_proc/indom.h | 1 + src/pmdas/linux_proc/pmda.c | 69 +++ src/pmdas/linux_proc/pmdaproc.1 | 4 + src/pmdas/linux_proc/proc_pid.c | 268 +++++++++ src/pmdas/linux_proc/proc_pid.h | 17 + src/pmdas/linux_proc/root_proc | 8 + 23 files changed, 1517 insertions(+), 220 deletions(-) delete mode 100644 qa/archives/pcp-numastat-1-node.0.xz delete mode 100644 qa/archives/pcp-numastat-1-node.index.xz delete mode 100644 qa/archives/pcp-numastat-1-node.meta.xz create mode 100644 qa/archives/pcp-numastat-8-node.0.xz create mode 100644 qa/archives/pcp-numastat-8-node.index.xz create mode 100644 qa/archives/pcp-numastat-8-node.meta.xz diff --git a/qa/743 b/qa/743 index cf40841be12..a0f38c493c1 100755 --- a/qa/743 +++ b/qa/743 @@ -17,9 +17,9 @@ pcp_numastat="$PCP_BINADM_DIR/pcp-numastat" test -x $pcp_numastat || _notrun "No pcp-numastat(1) installed" pcp_numastat="$python $pcp_numastat" -archive1="$here/archives/pcp-numastat-1-node" -archive2="-a $here/archives/pcp-numastat-1-node -z" -archive3="-a $here/archives/numa -z" +archive3="-a $here/archives/pcp-numastat-8-node" +#archive2="-a $here/archives/pcp-numastat-1-node -z" +archive1="$here/archives/numa" # real QA test starts here echo && echo 1 node numastat output, at archive start, cmd width @@ -35,20 +35,32 @@ echo && echo 1 node numastat output with optin -n, at archive start, cmd width PCP_ARCHIVE="$archive1" PCP_HOSTZONE=1 PCP_ORIGIN=-1 $pcp_numastat -n --width=64 echo && echo 1 node numastat output, at archive end, cmd width -pcp $archive2 -O-1 numastat --width=64 +pcp $archive3 -O-1 numastat --width=64 echo && echo 4 node numastat output, at archive end, large env width -NUMASTAT_WIDTH=1000 pcp $archive3 -O-1 numastat +NUMASTAT_WIDTH=1000 pcp $archive3 -O-1 numastat echo && echo 4 node meminfo and numastat output with option -mn, at archive end, large env width NUMASTAT_WIDTH=1000 pcp $archive3 -O-1 numastat -mn echo && echo 4 node numastat output, at archive end, small env width -NUMASTAT_WIDTH=50 pcp $archive3 -O-1 numastat +NUMASTAT_WIDTH=50 pcp $archive3 -O-1 numastat echo && echo 4 node meminfo and numastat output with option -mn, at archive end, small env width NUMASTAT_WIDTH=50 pcp $archive3 -O-1 numastat -mn +echo && echo 8 node process output with option -p, at archive end with multiple pids +pcp $archive3 -O-2 numastat -p 1 2 + +echo && echo 8 node process output with option -p, at archive end with single process name +pcp $archive3 -O-1 numastat -p systemd + +echo && echo 8 node process output with option -p, at archive end with single pid +pcp $archive3 -O-2 numastat -p 1 + +echo && echo 8 node process output with option -p, at archive end with single pid +pcp $archive3 -O-2 numastat -p 1 dbus -w 1 + # success, all done status=0 exit diff --git a/qa/743.out b/qa/743.out index 7fe6e6e4308..ceada22c46b 100644 --- a/qa/743.out +++ b/qa/743.out @@ -1,399 +1,728 @@ QA output created by 743 1 node numastat output, at archive start, cmd width -Linux 5.15.0-312.187.5.2.el8uek.x86_64 (ssosharm-ol8-2) 10/09/25 x86_64 (2 CPU) -Timestamp : 10/09/2025 01:58:51 +Linux 5.15.0-316.196.4.2.el8uek.x86_64 (localhost.localdomain) 03/10/26 x86_64 (1 CPU) +Timestamp : 03/10/2026 08:36:00 NUMA memory allocation statistics (pages) node0 -Hit : 958691136 +Hit : 177421634 Miss : 0 Foreign : 0 -Interleave_hit : 2202 -Local_node : 958674900 +Interleave_hit : 2126 +Local_node : 177421634 Other_node : 0 1 node meminfo output with option -m, at archive start, cmd width -Linux 5.15.0-312.187.5.2.el8uek.x86_64 (ssosharm-ol8-2) 10/09/25 x86_64 (2 CPU) -Timestamp : 10/09/2025 01:58:51 +Linux 5.15.0-316.196.4.2.el8uek.x86_64 (localhost.localdomain) 03/10/26 x86_64 (1 CPU) +Timestamp : 03/10/2026 08:36:00 Per-node system memory usage (KB) node0 -Total : 7830268 -Free : 740048 -Used : 7090220 -Active : 3762820 -Inactive : 2660596 -Active_anon : 228268 -Inactive_anon : 781604 -Active_file : 3534552 -Inactive_file : 1878992 -Unevictable : 12468 -Mlocked : 12468 -Dirty : 344 +Total : 1716004 +Free : 431224 +Used : 1284780 +Active : 448788 +Inactive : 549972 +Active_anon : 19836 +Inactive_anon : 164856 +Active_file : 428952 +Inactive_file : 385116 +Unevictable : 4000 +Mlocked : 0 +Dirty : 376 Writeback : 0 -FilePages : 5801156 -Mapped : 307696 -Anonpages : 613500 -Shmem : 376144 -KernelStack : 5280 -PageTables : 16628 +FilePages : 843032 +Mapped : 66600 +Anonpages : 160432 +Shmem : 20732 +KernelStack : 3232 +PageTables : 10172 NFS_Unstable : 0 Bounce : 0 WritebackTmp : 0 -Filehugepages : 81920 -Filepmdmapped : 79872 -Slab : 395392 -SlabReclaimable : 258984 -SlabUnreclaimable : 136408 -Anonhugepages : 323584 +Filehugepages : 0 +Filepmdmapped : 0 +Slab : 169112 +SlabReclaimable : 94216 +SlabUnreclaimable : 74896 +Anonhugepages : 26624 Shmemhugepages : 0 Shmempmdmapped : 0 HugepagesTotal : 0 HugepagesFree : 0 HugepagesSurp : 0 -SwapCached : 800 -Kreclaimable : 258984 +SwapCached : 8232 +Kreclaimable : 94216 1 node meminfo and numastat output with option -mn, at archive start, cmd width -Linux 5.15.0-312.187.5.2.el8uek.x86_64 (ssosharm-ol8-2) 10/09/25 x86_64 (2 CPU) -Timestamp : 10/09/2025 01:58:51 +Linux 5.15.0-316.196.4.2.el8uek.x86_64 (localhost.localdomain) 03/10/26 x86_64 (1 CPU) +Timestamp : 03/10/2026 08:36:00 Per-node system memory usage (KB) node0 -Total : 7830268 -Free : 740048 -Used : 7090220 -Active : 3762820 -Inactive : 2660596 -Active_anon : 228268 -Inactive_anon : 781604 -Active_file : 3534552 -Inactive_file : 1878992 -Unevictable : 12468 -Mlocked : 12468 -Dirty : 344 +Total : 1716004 +Free : 431224 +Used : 1284780 +Active : 448788 +Inactive : 549972 +Active_anon : 19836 +Inactive_anon : 164856 +Active_file : 428952 +Inactive_file : 385116 +Unevictable : 4000 +Mlocked : 0 +Dirty : 376 Writeback : 0 -FilePages : 5801156 -Mapped : 307696 -Anonpages : 613500 -Shmem : 376144 -KernelStack : 5280 -PageTables : 16628 +FilePages : 843032 +Mapped : 66600 +Anonpages : 160432 +Shmem : 20732 +KernelStack : 3232 +PageTables : 10172 NFS_Unstable : 0 Bounce : 0 WritebackTmp : 0 -Filehugepages : 81920 -Filepmdmapped : 79872 -Slab : 395392 -SlabReclaimable : 258984 -SlabUnreclaimable : 136408 -Anonhugepages : 323584 +Filehugepages : 0 +Filepmdmapped : 0 +Slab : 169112 +SlabReclaimable : 94216 +SlabUnreclaimable : 74896 +Anonhugepages : 26624 Shmemhugepages : 0 Shmempmdmapped : 0 HugepagesTotal : 0 HugepagesFree : 0 HugepagesSurp : 0 -SwapCached : 800 -Kreclaimable : 258984 +SwapCached : 8232 +Kreclaimable : 94216 NUMA memory allocation statistics (pages) node0 -Hit : 958691136 +Hit : 177421634 Miss : 0 Foreign : 0 -Interleave_hit : 2202 -Local_node : 958674900 +Interleave_hit : 2126 +Local_node : 177421634 Other_node : 0 1 node numastat output with optin -n, at archive start, cmd width -Linux 5.15.0-312.187.5.2.el8uek.x86_64 (ssosharm-ol8-2) 10/09/25 x86_64 (2 CPU) -Timestamp : 10/09/2025 01:58:51 +Linux 5.15.0-316.196.4.2.el8uek.x86_64 (localhost.localdomain) 03/10/26 x86_64 (1 CPU) +Timestamp : 03/10/2026 08:36:00 NUMA memory allocation statistics (pages) node0 -Hit : 958691136 +Hit : 177421634 Miss : 0 Foreign : 0 -Interleave_hit : 2202 -Local_node : 958674900 +Interleave_hit : 2126 +Local_node : 177421634 Other_node : 0 1 node numastat output, at archive end, cmd width -Linux 5.15.0-312.187.5.2.el8uek.x86_64 (ssosharm-ol8-2) 10/09/25 x86_64 (2 CPU) -Timestamp : 10/09/2025 01:58:51 +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:34 NUMA memory allocation statistics (pages) - node0 -Hit : 958691136 -Miss : 0 -Foreign : 0 -Interleave_hit : 2202 -Local_node : 958674900 -Other_node : 0 + node0 node1 node2 +Hit : 7778725 390933 1718591 + node3 node4 node5 +Hit : 1546998 269741 530654 + node6 node7 +Hit : 1461771 282136 + node0 node1 node2 +Miss : 0 0 0 + node3 node4 node5 +Miss : 0 0 0 + node6 node7 +Miss : 0 0 + node0 node1 node2 +Foreign : 0 0 0 + node3 node4 node5 +Foreign : 0 0 0 + node6 node7 +Foreign : 0 0 + node0 node1 node2 +Interleave_hit : 26847 26813 26848 + node3 node4 node5 +Interleave_hit : 26817 26845 26815 + node6 node7 +Interleave_hit : 26841 26810 + node0 node1 node2 +Local_node : 7555332 317817 1645685 + node3 node4 node5 +Local_node : 1474522 196934 475480 + node6 node7 +Local_node : 1257886 208813 + node0 node1 node2 +Other_node : 223393 73116 72906 + node3 node4 node5 +Other_node : 72476 72807 55174 + node6 node7 +Other_node : 203885 73323 4 node numastat output, at archive end, large env width -Linux 5.15.0-312.187.5.1.el8uek.x86_64 (ssosharm-pcp-test-vm) 10/08/25 x86_64 (256 CPU) -Timestamp : 10/08/2025 03:06:13 +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:34 NUMA memory allocation statistics (pages) - node0 node1 node2 node3 -Hit : 5526012 1668706 599469 3946390 -Miss : 0 0 0 0 -Foreign : 0 0 0 0 -Interleave_hit : 116943 117089 116944 117092 -Local_node : 5269259 1491020 463015 3767812 -Other_node : 256753 177686 136454 178578 + node0 node1 node2 node3 node4 node5 node6 node7 +Hit : 7778725 390933 1718591 1546998 269741 530654 1461771 282136 +Miss : 0 0 0 0 0 0 0 0 +Foreign : 0 0 0 0 0 0 0 0 +Interleave_hit : 26847 26813 26848 26817 26845 26815 26841 26810 +Local_node : 7555332 317817 1645685 1474522 196934 475480 1257886 208813 +Other_node : 223393 73116 72906 72476 72807 55174 203885 73323 4 node meminfo and numastat output with option -mn, at archive end, large env width -Linux 5.15.0-312.187.5.1.el8uek.x86_64 (ssosharm-pcp-test-vm) 10/08/25 x86_64 (256 CPU) -Timestamp : 10/08/2025 03:06:13 +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:34 Per-node system memory usage (KB) - node0 node1 node2 node3 -Total : 527706304 528451540 528463828 528445452 -Free : 520202476 526367896 526982800 526729080 -Used : 7503828 2083644 1481028 1716372 -Active : 400372 73892 45292 28656 -Inactive : 2674312 587220 151152 51028 -Active_anon : 1124 128 2040 24 -Inactive_anon : 648692 105548 14208 160 -Active_file : 399248 73764 43252 28632 -Inactive_file : 2025620 481672 136944 50868 -Unevictable : 16000 0 0 0 -Mlocked : 12928 0 0 0 -Dirty : 184 8 0 0 -Writeback : 0 0 0 0 -FilePages : 2456664 556144 188420 79532 -Mapped : 129836 151644 19008 6560 -Anonpages : 616632 100392 5960 152 -Shmem : 21028 700 8224 32 -KernelStack : 13188 10532 12564 9332 -PageTables : 15328 1876 188 8 -NFS_Unstable : 0 0 0 0 -Bounce : 0 0 0 0 -WritebackTmp : 0 0 0 0 -Filehugepages : 22528 16384 0 0 -Filepmdmapped : 20480 10240 0 0 -Slab : 729896 188284 170424 450728 -SlabReclaimable : 303968 41284 39348 285376 -SlabUnreclaimable : 425928 147000 131076 165352 -Anonhugepages : 157696 53248 0 0 -Shmemhugepages : 0 0 0 0 -Shmempmdmapped : 0 0 0 0 -HugepagesTotal : 0 0 0 0 -HugepagesFree : 0 0 0 0 -HugepagesSurp : 0 0 0 0 -SwapCached : 0 0 0 0 -Kreclaimable : 303968 41284 39348 285376 + node0 node1 node2 node3 node4 node5 node6 node7 +Total : 395394544 396345396 396345396 396345396 396345396 396345396 396345396 396191872 +Free : 387723236 395335052 395301836 395340584 395489944 395342740 394823412 395314388 +Used : 7671308 1010344 1043560 1004812 855452 1002656 1521984 877484 +Active : 432604 236 22772 6520 8 240 3336 356 +Inactive : 3245732 116468 50588 75916 276 6628 81496 65420 +Active_anon : 2448 20 100 8 0 8 24 4 +Inactive_anon : 795080 82580 41396 9572 268 6256 40748 29864 +Active_file : 430156 216 22672 6512 8 232 3312 352 +Inactive_file : 2450652 33888 9192 66344 8 372 40748 35556 +Unevictable : 12948 0 0 0 0 0 0 0 +Mlocked : 12948 0 0 0 0 0 0 0 +Dirty : 1688 0 0 0 0 0 0 0 +Writeback : 0 0 0 0 0 0 0 0 +FilePages : 2910280 34160 32700 72928 28 616 44104 35928 +Mapped : 129092 31452 3492 64 0 56 0 19420 +Anonpages : 765648 74064 32500 9508 256 5852 40728 29664 +Shmem : 18708 56 836 72 12 12 44 20 +KernelStack : 14256 9636 9588 9476 10196 11072 9984 9472 +PageTables : 15152 892 332 264 4 216 132 368 +NFS_Unstable : 0 0 0 0 0 0 0 0 +Bounce : 0 0 0 0 0 0 0 0 +WritebackTmp : 0 0 0 0 0 0 0 0 +Filehugepages : 8192 0 0 0 0 0 0 0 +Filepmdmapped : 8192 0 0 0 0 0 0 0 +Slab : 800568 93604 125544 152044 106200 152240 195792 86260 +SlabReclaimable : 414968 15728 30600 52008 14444 30800 33964 13936 +SlabUnreclaimable : 385600 77876 94944 100036 91756 121440 161828 72324 +Anonhugepages : 116736 45056 18432 8192 0 2048 2048 22528 +Shmemhugepages : 0 0 0 0 0 0 0 0 +Shmempmdmapped : 0 0 0 0 0 0 0 0 +HugepagesTotal : 0 0 0 0 0 0 0 0 +HugepagesFree : 0 0 0 0 0 0 0 0 +HugepagesSurp : 0 0 0 0 0 0 0 0 +SwapCached : 0 0 0 0 0 0 0 0 +Kreclaimable : 414968 15728 30600 52008 14444 30800 33964 13936 NUMA memory allocation statistics (pages) - node0 node1 node2 node3 -Hit : 5526012 1668706 599469 3946390 -Miss : 0 0 0 0 -Foreign : 0 0 0 0 -Interleave_hit : 116943 117089 116944 117092 -Local_node : 5269259 1491020 463015 3767812 -Other_node : 256753 177686 136454 178578 + node0 node1 node2 node3 node4 node5 node6 node7 +Hit : 7778725 390933 1718591 1546998 269741 530654 1461771 282136 +Miss : 0 0 0 0 0 0 0 0 +Foreign : 0 0 0 0 0 0 0 0 +Interleave_hit : 26847 26813 26848 26817 26845 26815 26841 26810 +Local_node : 7555332 317817 1645685 1474522 196934 475480 1257886 208813 +Other_node : 223393 73116 72906 72476 72807 55174 203885 73323 4 node numastat output, at archive end, small env width -Linux 5.15.0-312.187.5.1.el8uek.x86_64 (ssosharm-pcp-test-vm) 10/08/25 x86_64 (256 CPU) -Timestamp : 10/08/2025 03:06:13 +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:34 NUMA memory allocation statistics (pages) node0 node1 -Hit : 5526012 1668706 +Hit : 7778725 390933 node2 node3 -Hit : 599469 3946390 +Hit : 1718591 1546998 + node4 node5 +Hit : 269741 530654 + node6 node7 +Hit : 1461771 282136 node0 node1 Miss : 0 0 node2 node3 +Miss : 0 0 + node4 node5 +Miss : 0 0 + node6 node7 Miss : 0 0 node0 node1 Foreign : 0 0 node2 node3 +Foreign : 0 0 + node4 node5 +Foreign : 0 0 + node6 node7 Foreign : 0 0 node0 node1 -Interleave_hit : 116943 117089 +Interleave_hit : 26847 26813 node2 node3 -Interleave_hit : 116944 117092 +Interleave_hit : 26848 26817 + node4 node5 +Interleave_hit : 26845 26815 + node6 node7 +Interleave_hit : 26841 26810 node0 node1 -Local_node : 5269259 1491020 +Local_node : 7555332 317817 node2 node3 -Local_node : 463015 3767812 +Local_node : 1645685 1474522 + node4 node5 +Local_node : 196934 475480 + node6 node7 +Local_node : 1257886 208813 node0 node1 -Other_node : 256753 177686 +Other_node : 223393 73116 node2 node3 -Other_node : 136454 178578 +Other_node : 72906 72476 + node4 node5 +Other_node : 72807 55174 + node6 node7 +Other_node : 203885 73323 4 node meminfo and numastat output with option -mn, at archive end, small env width -Linux 5.15.0-312.187.5.1.el8uek.x86_64 (ssosharm-pcp-test-vm) 10/08/25 x86_64 (256 CPU) -Timestamp : 10/08/2025 03:06:13 +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:34 Per-node system memory usage (KB) node0 node1 -Total : 527706304 528451540 +Total : 395394544 396345396 node2 node3 -Total : 528463828 528445452 +Total : 396345396 396345396 + node4 node5 +Total : 396345396 396345396 + node6 node7 +Total : 396345396 396191872 node0 node1 -Free : 520202476 526367896 +Free : 387723236 395335052 node2 node3 -Free : 526982800 526729080 +Free : 395301836 395340584 + node4 node5 +Free : 395489944 395342740 + node6 node7 +Free : 394823412 395314388 node0 node1 -Used : 7503828 2083644 +Used : 7671308 1010344 node2 node3 -Used : 1481028 1716372 +Used : 1043560 1004812 + node4 node5 +Used : 855452 1002656 + node6 node7 +Used : 1521984 877484 node0 node1 -Active : 400372 73892 +Active : 432604 236 node2 node3 -Active : 45292 28656 +Active : 22772 6520 + node4 node5 +Active : 8 240 + node6 node7 +Active : 3336 356 node0 node1 -Inactive : 2674312 587220 +Inactive : 3245732 116468 node2 node3 -Inactive : 151152 51028 +Inactive : 50588 75916 + node4 node5 +Inactive : 276 6628 + node6 node7 +Inactive : 81496 65420 node0 node1 -Active_anon : 1124 128 +Active_anon : 2448 20 node2 node3 -Active_anon : 2040 24 +Active_anon : 100 8 + node4 node5 +Active_anon : 0 8 + node6 node7 +Active_anon : 24 4 node0 node1 -Inactive_anon : 648692 105548 +Inactive_anon : 795080 82580 node2 node3 -Inactive_anon : 14208 160 +Inactive_anon : 41396 9572 + node4 node5 +Inactive_anon : 268 6256 + node6 node7 +Inactive_anon : 40748 29864 node0 node1 -Active_file : 399248 73764 +Active_file : 430156 216 node2 node3 -Active_file : 43252 28632 +Active_file : 22672 6512 + node4 node5 +Active_file : 8 232 + node6 node7 +Active_file : 3312 352 node0 node1 -Inactive_file : 2025620 481672 +Inactive_file : 2450652 33888 node2 node3 -Inactive_file : 136944 50868 +Inactive_file : 9192 66344 + node4 node5 +Inactive_file : 8 372 + node6 node7 +Inactive_file : 40748 35556 node0 node1 -Unevictable : 16000 0 +Unevictable : 12948 0 node2 node3 +Unevictable : 0 0 + node4 node5 +Unevictable : 0 0 + node6 node7 Unevictable : 0 0 node0 node1 -Mlocked : 12928 0 +Mlocked : 12948 0 node2 node3 +Mlocked : 0 0 + node4 node5 +Mlocked : 0 0 + node6 node7 Mlocked : 0 0 node0 node1 -Dirty : 184 8 +Dirty : 1688 0 node2 node3 +Dirty : 0 0 + node4 node5 +Dirty : 0 0 + node6 node7 Dirty : 0 0 node0 node1 Writeback : 0 0 node2 node3 +Writeback : 0 0 + node4 node5 +Writeback : 0 0 + node6 node7 Writeback : 0 0 node0 node1 -FilePages : 2456664 556144 +FilePages : 2910280 34160 node2 node3 -FilePages : 188420 79532 +FilePages : 32700 72928 + node4 node5 +FilePages : 28 616 + node6 node7 +FilePages : 44104 35928 node0 node1 -Mapped : 129836 151644 +Mapped : 129092 31452 node2 node3 -Mapped : 19008 6560 +Mapped : 3492 64 + node4 node5 +Mapped : 0 56 + node6 node7 +Mapped : 0 19420 node0 node1 -Anonpages : 616632 100392 +Anonpages : 765648 74064 node2 node3 -Anonpages : 5960 152 +Anonpages : 32500 9508 + node4 node5 +Anonpages : 256 5852 + node6 node7 +Anonpages : 40728 29664 node0 node1 -Shmem : 21028 700 +Shmem : 18708 56 node2 node3 -Shmem : 8224 32 +Shmem : 836 72 + node4 node5 +Shmem : 12 12 + node6 node7 +Shmem : 44 20 node0 node1 -KernelStack : 13188 10532 +KernelStack : 14256 9636 node2 node3 -KernelStack : 12564 9332 +KernelStack : 9588 9476 + node4 node5 +KernelStack : 10196 11072 + node6 node7 +KernelStack : 9984 9472 node0 node1 -PageTables : 15328 1876 +PageTables : 15152 892 node2 node3 -PageTables : 188 8 +PageTables : 332 264 + node4 node5 +PageTables : 4 216 + node6 node7 +PageTables : 132 368 node0 node1 NFS_Unstable : 0 0 node2 node3 +NFS_Unstable : 0 0 + node4 node5 +NFS_Unstable : 0 0 + node6 node7 NFS_Unstable : 0 0 node0 node1 Bounce : 0 0 node2 node3 +Bounce : 0 0 + node4 node5 +Bounce : 0 0 + node6 node7 Bounce : 0 0 node0 node1 WritebackTmp : 0 0 node2 node3 +WritebackTmp : 0 0 + node4 node5 +WritebackTmp : 0 0 + node6 node7 WritebackTmp : 0 0 node0 node1 -Filehugepages : 22528 16384 +Filehugepages : 8192 0 node2 node3 +Filehugepages : 0 0 + node4 node5 +Filehugepages : 0 0 + node6 node7 Filehugepages : 0 0 node0 node1 -Filepmdmapped : 20480 10240 +Filepmdmapped : 8192 0 node2 node3 +Filepmdmapped : 0 0 + node4 node5 +Filepmdmapped : 0 0 + node6 node7 Filepmdmapped : 0 0 node0 node1 -Slab : 729896 188284 +Slab : 800568 93604 node2 node3 -Slab : 170424 450728 +Slab : 125544 152044 + node4 node5 +Slab : 106200 152240 + node6 node7 +Slab : 195792 86260 node0 node1 -SlabReclaimable : 303968 41284 +SlabReclaimable : 414968 15728 node2 node3 -SlabReclaimable : 39348 285376 +SlabReclaimable : 30600 52008 + node4 node5 +SlabReclaimable : 14444 30800 + node6 node7 +SlabReclaimable : 33964 13936 node0 node1 -SlabUnreclaimable : 425928 147000 +SlabUnreclaimable : 385600 77876 node2 node3 -SlabUnreclaimable : 131076 165352 +SlabUnreclaimable : 94944 100036 + node4 node5 +SlabUnreclaimable : 91756 121440 + node6 node7 +SlabUnreclaimable : 161828 72324 node0 node1 -Anonhugepages : 157696 53248 +Anonhugepages : 116736 45056 node2 node3 -Anonhugepages : 0 0 +Anonhugepages : 18432 8192 + node4 node5 +Anonhugepages : 0 2048 + node6 node7 +Anonhugepages : 2048 22528 node0 node1 Shmemhugepages : 0 0 node2 node3 +Shmemhugepages : 0 0 + node4 node5 +Shmemhugepages : 0 0 + node6 node7 Shmemhugepages : 0 0 node0 node1 Shmempmdmapped : 0 0 node2 node3 +Shmempmdmapped : 0 0 + node4 node5 +Shmempmdmapped : 0 0 + node6 node7 Shmempmdmapped : 0 0 node0 node1 HugepagesTotal : 0 0 node2 node3 +HugepagesTotal : 0 0 + node4 node5 +HugepagesTotal : 0 0 + node6 node7 HugepagesTotal : 0 0 node0 node1 HugepagesFree : 0 0 node2 node3 +HugepagesFree : 0 0 + node4 node5 +HugepagesFree : 0 0 + node6 node7 HugepagesFree : 0 0 node0 node1 HugepagesSurp : 0 0 node2 node3 +HugepagesSurp : 0 0 + node4 node5 +HugepagesSurp : 0 0 + node6 node7 HugepagesSurp : 0 0 node0 node1 SwapCached : 0 0 node2 node3 +SwapCached : 0 0 + node4 node5 +SwapCached : 0 0 + node6 node7 SwapCached : 0 0 node0 node1 -Kreclaimable : 303968 41284 +Kreclaimable : 414968 15728 node2 node3 -Kreclaimable : 39348 285376 +Kreclaimable : 30600 52008 + node4 node5 +Kreclaimable : 14444 30800 + node6 node7 +Kreclaimable : 33964 13936 NUMA memory allocation statistics (pages) node0 node1 -Hit : 5526012 1668706 +Hit : 7778725 390933 node2 node3 -Hit : 599469 3946390 +Hit : 1718591 1546998 + node4 node5 +Hit : 269741 530654 + node6 node7 +Hit : 1461771 282136 node0 node1 Miss : 0 0 node2 node3 +Miss : 0 0 + node4 node5 +Miss : 0 0 + node6 node7 Miss : 0 0 node0 node1 Foreign : 0 0 node2 node3 +Foreign : 0 0 + node4 node5 +Foreign : 0 0 + node6 node7 Foreign : 0 0 node0 node1 -Interleave_hit : 116943 117089 +Interleave_hit : 26847 26813 node2 node3 -Interleave_hit : 116944 117092 +Interleave_hit : 26848 26817 + node4 node5 +Interleave_hit : 26845 26815 + node6 node7 +Interleave_hit : 26841 26810 node0 node1 -Local_node : 5269259 1491020 +Local_node : 7555332 317817 node2 node3 -Local_node : 463015 3767812 +Local_node : 1645685 1474522 + node4 node5 +Local_node : 196934 475480 + node6 node7 +Local_node : 1257886 208813 node0 node1 -Other_node : 256753 177686 +Other_node : 223393 73116 node2 node3 -Other_node : 136454 178578 +Other_node : 72906 72476 + node4 node5 +Other_node : 72807 55174 + node6 node7 +Other_node : 203885 73323 + + +8 node process output with option -p, at archive end with multiple pids +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:33 +Per-node process memory usage (in MBs) +PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total +---------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +1 (systemd) 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 +2 (kthreadd) 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +---------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +Total 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 + + +8 node process output with option -p, at archive end with single process name +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:34 +Per-node process memory usage (in MBs) +PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total +---------------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +1 (systemd) 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 +6267 (systemd-journal) 12.06 0.02 0.02 0.02 0.00 0.00 0.00 0.00 12.12 +6316 (systemd-udevd) 14.64 0.00 0.17 0.16 0.23 0.08 0.25 0.27 15.80 +8684 (systemd-logind) 9.71 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9.71 +8700 (dbus-daemon) 6.28 0.00 0.00 0.00 0.00 0.00 0.02 0.00 6.30 +13920 (systemd) 9.51 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9.51 +19096 (systemd) 9.23 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9.23 +19917 (systemd) 9.27 0.14 0.00 0.00 0.00 0.00 0.00 0.00 9.41 +---------------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +Total 87.03 0.41 0.19 0.20 0.23 0.08 0.27 0.27 88.68 + + +8 node process output with option -p, at archive end with single pid +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:33 +Per-node process memory usage (in MBs) for PID 1 (systemd) + Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total + --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +Huge 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +Heap 5.89 0.25 0.00 0.02 0.00 0.00 0.00 0.00 6.16 +Stack 0.05 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.05 +Private 10.39 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10.39 +---------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +Total 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 + + +8 node process output with option -p, at archive end with single pid +Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) +Timestamp : 03/16/2026 15:48:33 +Per-node process memory usage (in MBs) +PID Node 0 +------------------ --------------- +1 (systemd) 16.33 +8700 (dbus-daemon) 6.28 +------------------ --------------- +Total 22.61 + +PID Node 1 +------------------ --------------- +1 (systemd) 0.25 +8700 (dbus-daemon) 0.00 +------------------ --------------- +Total 0.25 + +PID Node 2 +------------------ --------------- +1 (systemd) 0.00 +8700 (dbus-daemon) 0.00 +------------------ --------------- +Total 0.00 + +PID Node 3 +------------------ --------------- +1 (systemd) 0.02 +8700 (dbus-daemon) 0.00 +------------------ --------------- +Total 0.02 + +PID Node 4 +------------------ --------------- +1 (systemd) 0.00 +8700 (dbus-daemon) 0.00 +------------------ --------------- +Total 0.00 + +PID Node 5 +------------------ --------------- +1 (systemd) 0.00 +8700 (dbus-daemon) 0.00 +------------------ --------------- +Total 0.00 + +PID Node 6 +------------------ --------------- +1 (systemd) 0.00 +8700 (dbus-daemon) 0.02 +------------------ --------------- +Total 0.02 + +PID Node 7 +------------------ --------------- +1 (systemd) 0.00 +8700 (dbus-daemon) 0.00 +------------------ --------------- +Total 0.00 + +PID Total +------------------ --------------- +1 (systemd) 16.60 +8700 (dbus-daemon) 6.30 +------------------ --------------- +Total 22.90 diff --git a/qa/archives/GNUmakefile b/qa/archives/GNUmakefile index 3276e076234..6dd81a0968b 100644 --- a/qa/archives/GNUmakefile +++ b/qa/archives/GNUmakefile @@ -70,8 +70,8 @@ DEFLATE = small.0.xz small.meta small.index \ all-ubuntu.22.04.0.xz all-ubuntu.22.04.meta.xz all-ubuntu.22.04.index \ bind2-9.18.0.xz bind2-9.18.meta.xz bind2-9.18.index \ bind2-9.18+.0.xz bind2-9.18+.meta.xz bind2-9.18+.index \ - pcp-numastat-1-node.0.xz pcp-numastat-1-node.meta.xz \ - pcp-numastat-1-node.index.xz gfs.0.xz gfs.meta gfs.index \ + pcp-numastat-8-node.0.xz pcp-numastat-8-node.meta.xz \ + pcp-numastat-8-node.index.xz gfs.0.xz gfs.meta gfs.index \ numa.0.xz numa.meta.xz numa.index.xz \ amdgpu.0.xz amdgpu.meta.xz amdgpu.index \ nvidiagpu.0.xz nvidiagpu.meta.xz nvidiagpu.index diff --git a/qa/archives/mk.numa b/qa/archives/mk.numa index 683e1751bd8..c90631090c0 100755 --- a/qa/archives/mk.numa +++ b/qa/archives/mk.numa @@ -14,7 +14,7 @@ trap "rm -f $tmp.*; exit 0" 0 1 2 3 15 nnode=`pmprobe -v hinv.nnode | $PCP_AWK_PROG '{print $NF}'` if [ -z "$nnode" -o "$nnode" -lt 2 ] then - echo "$0: Error: hinv.nnode ($nnode) not > 1" + echo "$0: Error: hinv.nnode ($nnode) not > 2" exit 1 fi @@ -27,6 +27,10 @@ log mandatory on once { log mandatory on 1 sec { mem.numa.alloc mem.numa.util + proc.psinfo.pid + proc.psinfo.cmd + proc.psinfo.psargs + proc.numa_maps kernel.pernode End-of-File diff --git a/qa/archives/numa.0.xz b/qa/archives/numa.0.xz index b78a1621aa968e5f48bed17f54cd11bae8b4e92a..fa71ccce6190eacc9e43d05fa6332b7e82fb1865 100644 GIT binary patch literal 6484 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 literal 7020 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 diff --git a/qa/archives/numa.meta.xz b/qa/archives/numa.meta.xz index 5d208b37d32053070f0f2c5369c5d6d0826965cd..b3e2d875075e41c4709e9a6c4e77838ce81851ef 100644 GIT binary patch literal 7960 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 K000001X)@SfGxcM diff --git a/qa/archives/pcp-numastat-1-node.0.xz b/qa/archives/pcp-numastat-1-node.0.xz deleted file mode 100644 index e1e6e6e7e89e1864a1cd8c1217b25e2f54cb52f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2020 zcmVt=RA8C9kNc4Tz<-A?E znI}N~5gD%$9h9PsWUX=!Mgxz(PdN`Y;d!7yVspOqWM3cUaBLzsxa3zURZfbBPwgk4 z(IpBRh}7G_9!3gJ!FeNO6a5;S@k{|_1+N;T)z}r@7#?5b{+z`%sQJDMyvppFc)QH> zNTS36jip=6LgE=-`MH8`a@TGwS+b8g1_q+1yL!VM0YvTs zQ$8NpD_?ATAyVe;0|p|`6+C5*FdEVwAg9N%GEhK3R6}4EZzE5Jq@q|p941o=tsqov zKX^rqt{~Uy!9uIAw%P?S>e{G>3If~`2HET3t`f7;mPnoErqZPBr+DjBDGNr~0wgo} z_#6XdPZ3Y_4+(l}cSv&e1(q$uDrQV~0NT^46XS0=U`of^DrPdgyD#Nb(FZ^wHphQ4 zt}#57T|%u;J4-B3GDxQ7M)?sUw;2cUe#E%*7%gxjFC2psjZ{ zFDC`|6yY}iOO4n8J&W^RvH=4|kbfpELudc)gB}bfW$Y!ILc{f5Jg4|uKVsRx)FB@c z&?qXr-L@PaOoi=trBPMSwxvKf%Y+AR$D@rI0jskx;3t;Z8rdWT$iccYTYDX$zPUo~ zW=1qkrqUBd&--AHJQwsgBTNLio{45cTJ(poAz?}MzuJ(3u&uc(3!0CDOjn=(ul5n5 z{D*g!1o3MeJ$PTj5l&^SO+N>GOedQ^34LZCBGj?iPi{&h>+1zRhFi{5az})5Cba=8 zCiJZEZr$~B>#CiXl2KUn0>d zoUhwg3(D7_v;fhf_EJzl9Ol6Tvsne2HAsI&H|VS?73~oae-soxXRY|kTHe@IZ5lb=3>Q znd<>wXIYkju`q;hxx~Qp=}1jO%8oSl(qP%F(i9Em&MT|I8ltwOo1D;#Q1bpS`d|WLO`|~5o{791uhNX$EY%}31nLl{6ObsM@U4%ye511peqXNQ;UZS z11Dcg2JQ21V0#)fiS--hvvQ~nObshwi!1~hkqHnAoR~5PV6Cqoa&Kyz znGxmZxS|1lA!iu1VH)1!l$)NTxXPD`kLSNlnot-X zB;UFs+#Vw@7ltLNYtD-=>4A|U4pJeQt8{ayG_N}eEaX!zBYw|Z4(%Z;gcW~f4RdX6 zq83D-b95NVker(-2{>~h=7|6B9<4fiBW=ZzV3T(vcSopZ14vgeq(nt8_MDRXmm({` zD~X270=R=lz#3jhqs@YQzyNZZc`-AzN_J1pU@Xu7+s{jy;lX(s57#;(w(gO{;4pVi z;sy63jBx{oln-Zr8^*aN#)0Th6ZO@;?1ZcB>6;J`Z7;us0~$z6)z?wCf^C7P?Tp`N zPn}f89FS^5xFRxIuMbQ`5^`g#0itp|6+_VW(|eKjikD`$?z2qFew=2xDA|4y=y?yV znV3EYeR+>9Y^cTA!I}O%O(-L3A>K;8kb;lA2I-&xrI{+?NlyF$@}`I{;bE0nX~!zK z05}EulA8wKD%m#?0-2I`UYVwRdZ7F=9=>oXoQY;Bc=92bC#+W`2HVr1OZLF$MZ|Ps zC);4qSWNbIIRI-BY#NI09KWyp7;zdJX!rmg^xUIe_AvY~Q&_QlIHiRJ9^7yfxI6%z z%B$ZM)>${mLU0q`ZF1+(xF(;E?sopAd9#F-DtVV%-3y5G2A3*u?6?3wdpNGQzY?b= z(p~&&PvLIz5j5b!pJQceRxAJ&nZysH$VVyw0l*Kix&Z*CSxua=#Ao{g000001X)^+ C&$@B| diff --git a/qa/archives/pcp-numastat-1-node.index.xz b/qa/archives/pcp-numastat-1-node.index.xz deleted file mode 100644 index 2b96423f03674bdde14c0dc5d4e82f1f75b4d43b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmV;B0B`^OH+ooF000E$*0e?f03iVu0001VFXf})0KWiET>t=RA8C9kNc4Tz<-A?E znI}N~5gD(6bi&=zX==w<{F#__qzPW&X~7562d54sP7+m($hh8&&PEum0D9aD-4Kz( y#IjjudAH^yQ(t=RA8C9kNc4Tz<-A?E znI}N~5gD(6bsPl)9{1QPx{6wcXYo_-ZcNUpDyByZla6nNp%j`aa9IDX86IPRALMkb z_23V80gk-&-c9WK?iLDDhyZy%NJ*emD8Lu+FXsxiN_j%6we27|u;>C3tF4d60G5*1 zN^f8pZ4sKKBLjEY)6k?{LI!ts+Nr#Jm>fBvIF96u$B> zBj(}&ISvC%a1)QMFA>bA!KBPt>AG3~myfA6Dwub23Pz1*?U)&A6VC0MUT9H%>Gxd~ zh+#8&JrGoh*Ob<@bh{L~?|OuR(cCjsjtgGX!D_=}YrZdvxo$cUWb+fLUoITiginERVn_PWW_nU}U}&qXKEaO= z691d!=y4Sh&s?(r>~B}aUVyqN*zRau{c~9%xbQyZl05$DLuzL5iznq)%f7jFdEhZvvyrXU9b5XttZ*uJq zVN=3~xG_Enq+n_F!k~SLRVYp2aiR=|UTH9m`U$Ivgxih=sZ4x$8VHmpH%of2%s?Va zxuJhxqq*5~Jy`%HkdSHO0(M_>b!i-h1)G~LPO9k+Db3b=5y^|vA{v=;04zB!M_tx2 zkUC}RGc`SN_jv_MJv-8Kz`DN(@;)LRk3tKv--W&r+mIi>^@E04Bl_fnv4vN*<2nkA z6yZ28xe5f9MuPGL%6o^e_U(0hz0`}KkG#&z7E_QZnKvG^T;{ODM4tZth@bm~I0;+f z{Zoz@GNUjyH*|frL%Zkl5A0$UHA_N;B5@%6Mcdbz1SIhGsy)?OO^!cYpXQL^Anb?U zI>k{LfgX`x$34EhBI^UTk}!`sB>{0}`vq5(c$cVAcHb4*V~;Cr`!aCUSx`nCAk3jyt2Jz$Hx zReh8cR(HkEmjAwQIp{)hqNrYsE7$LvBn5YNzz0&(=k7qT~25=jmg?Z z;y{NTIzM4YDVOPFUrK?Pk#&>-=raHz5^Kpe)e^zGYrg%CT{Z;P-*a;Rip^Mn06{vV z6y~>G?y1lt`1+{0rRjZ}yS&s(Y@BQLwGR1y`Wxn`!;~~zmM)`iv7-?Dt!`Wv>8WSTQ}V45yk(wzO9^9_+Nh>JUAzEjB zZB48U&pFgA;SfR5Qm&V=WP9jtaiO|DeWxQvZO=OXdluUS_FqQQE})awKZ67Rn4S(c zIfJnXr>y$bVMKOgQ z^d^8OqlLV|zcP)`Lt(n;Lt(ggse^7^apA|=`G`!hZ3f+w8p`S1raw!~V6JBE`6L|z_z~*cG$B$&%kE$?RN8M;nYyh04&fZAyCAu6 zbMkvIw2XgSp1OU3yP=_7<|D>u(t|H9ul@TXcIadj(Cl`6>3o0MDSChh;fU#)2<#HB~;8}nA(Q;A#bo9hJL zk`BltDY8)HQWQ|b9@>L4ElN1-r6^GtNF%Tr42+yGTFL>h>Xs!7-BKaO*t+ zWt-L5$e+1L9?df^InG-kF)!eifx09h>?>O2Z8m4${NPc(S205xLQp#vOx;g+A+>Sa zw(4O-SniS+!Q>pFSSc{chhU$`)wUWJ2RnGBR1*P=V+>3S$*|z<5fE=Hc*j@5p2EYY2X7}XEvVtgg)N|zs(`}h?WxpYvI&5&tqk8deBA>gjZWB6VCLmLRj{Grn+ z|8{{oH^>xAsFGLQ(xL0(v3Em~>N;snLG>bFf|r4>LoWQ99uvFmXzeT^hvwKl3jkQF zP7aaPZDRr8C-GBQlaBGBSW1HP93_y`Qv_Iug&wpEy|mFS5pN)GWkZGGNdiRZY`al{ zw13>A9G;Vj?PvAcf3S3YGgklqy8#F%g5N&lDkx<1&so zf+(^U&L9!G@(w_);AH93PMBOK>)n%k=FMx|nJJbp@2T53m6Z6w2XGB-`hx4gTmn_O zi$&b-DBgcw6nZKSWXY9%;>K+B>4T1*mu^eo28l9GhG6v@a#gHv0-icTv<{{j-i_N1 zV!XSykNyifor48=#j5P;0A(SXx%oi1W+E{ep9-5=mJVDW8K8CSQ8&I~yI0K#oVP>%22L{JjqF$z)Cm94Ly1$TG z!p*t(wkmu#B_#%SBDtY&wq(zXYeI_;L~#TRh7;q77#MJ?G-VI-T+_A_wr(Oiko4WT za@CRR!4h@j$oV2czk^#gW2Dd2`jtT_RHS~>RvIG-A4+XJCcIRNzDp@F2pdI?%jcr< z@;cRV$usp|o6hULxi5N}ENGrwU)Am0>_9dH>7P!hnBsVl~z89OmkQ70V z$&CqN=okoJ)<0zmE8Dn!Z18`{G2b27o0OPDsTLuUNNS>SyRwk0`h&Z+7h=zP>ZY>D zeTs(b5hNHJ+Gsppb7#aA=xu6ol!zrOPlbdnE<{;Ed^M6*L9zp*46>A{?S1>1L1k)k{1T+6}Hlw1Htnd}#w4){fW_j+mq^90kqZ zESMtcO!OrZSiZyCJRxorQKe9S^Y?eETzk9&2xgusQa)&W_*iNP z;$lm?9tMBAvC0f7}H>eAYI3_1Fm^fIiR zJOV@v;9fC*;3h$1BiC#YRYDU*vfSa(i*MwCXs5;7ic@$o*g6Qw-R>yAO13MMbWtmA1s6WdHL>qUqLGSh5Ac8P}{Hx)Rh> zx;0bHcZ^Se>b?@CXeWovOp?>fFI-y$zWt-e5+D!<*x(75v&OfSAtOZO`my*!G?*tjjQrP+h+Mp;VCbYd2n2bJysQQGFC&n%rb^zP@>^3^UHfIpi(n z06!!gR6TqR_?~M5&f?yV9SP33oFw(+_&@G4%}XoL-}1ZNBpLNd|Kk39iv8{}Ig(l# zX=avJPi`|~xUwI+`b*z=i1*y58iXs?axh^bec;M;5+2vRRx(qbPz>oH0L6jm(#X`} zM4^o2wYTBBBhcgNYYnO&A7({(ELWWdM~IMZb$mCb8 zup>W*G06G#KR^p@2P2#H@f{x?9Tg3F)!!P}khk`{4Wr&f~lFN8xY#X_zzYf6oyJ@+$x>qjfNzF2DRQ$=Z^u(gMH7SQmTXdWDb+4lC@{8<4X za}XC%b_^5b*j`)v33sW^3J3aH0`Po?v`x)8EYkz^^cYbEKwi0be_T zwBTyvMVeccnb#`@aA5dG%%e5Y^HPY4Vu78a&!>pZ*=PnFh0oFJp( zkDXSNHSy4(DDh>s!*-d>k5!3qqj3%cTA>dOaz6{{xFZ4v<3PUnKcV%XLAO8XE^G_f zr%+<;ytw}*uQK_&sMayLv#>Y z`f^vf9v3sFQoqrLsq+6S&lv9IdiqC4YK%KvDE7}+o-I|a^wPtx%iRJO_)+Z;=)jT-v@20Em?lX22bt)fR5I7KIRRP&r=?Ay1&4IC)KS z0v=X+5kt*Az?^~8sc7m~ou21-V_flBw}o?+S34(jlyKsd8mZTo9=JllyDt=J3f9ai2}qDD7(;Fj zKyfB-jr|b0q2#btG%Jv#mB6<)r|acSqc)m`WV>-_vd4ecxO9!PLz|Avj^Q}la7>Rt z9M^w`Y8^=(W-mQ=iLa5P)$L>)_!5rTvR>A1CQn8WLKwHGXRVt`OutfJ7`NlNA%I{l>D&A@151%G??qA za=4C7kGPnvKy--umtaioLbv z?wMaX?DA5Vn@^LGo2P)BgcBX%z_Eoy-RS~sdSIY@3R8sBS2)sQ)Ae5>$b4uJwBBOQ&mG{5C6$4w4=5wnfwCYAKTC8Rw)#vX%0-hgd~%-gjJkNhYtGx0QeWR4SsC>N|(Wv(`eJ~Y2)a>!*jgdla#ji@1l!Y7eR`%$R4U|i<> zlpf1lb5eq;JlHHy6Vd1A36SrccAgDW>Ik)N2`AF@U9fU)31x5EU@b$m|rLDBn%8 z`FL4ZwMn1{T~o~{!9K;JI3Dz1@;p;7@$wByNc83Zp;sLLw98j)cx z7V|LIUTVk#njd3b3#E;4itXXB@CC45K$ZEL?{1SYhIHP+7F8`l0q>ba-{+*FHlXo{~=oKKMc%aSV7!1!$vr=(BR1s!MVr8FX` zrUk|QsQX`8s=}(>46B~s7eu=HUim$IkSa&}tYWE!y~p2R;U|BB3+UqRgwFdoxzu(;*ahv;4Z7Bz zOfRSS3A?rYdiRDB#qNM|ATQID+!`JbqM?(f`m|S!HLlzfv0xnSUP^B&*hcC)0uQZxsw-Qy%U6_{x;mrnB7J06*lY(MhGX zYvy8E$lAOyEv4@}y|$ulG82r;bU?CF7s>Qi7C{4!I-WokCD7w);~l>g=H6-=M;ok7 zcH8;(`}457(V9VUBf`#isdYnFTkO^DzVN~K!8jmkblv&wnE)*wT4)}%-3x&!m<(V5 ziC|+(&ZH{< zkhR}MF^^*Hd77cic{5etBgDiv@@zbSFIdKWp2TQw$3FBwQmO}O#NYin(eF<{!>_pV zOX|f{u{SY}H(c ziY7#axauq+2vO|t&a~n=4C|P)>e4%hl2etDYN#`dz2V#t5sF2GY7PJdvGT*X!)Y_e zZzh~dTy#wyys_D0KQndIzuD%yl_A&O3byEFEX_;j9O8i5(M5iVtfu(Wy+Txdj-+db zklOv#N={I66ycR3Vd&+1P$1n zcwol?Cj!jUffJ0Kxl;HoMfBlld$h=p|2`QxCJlxOf^?N40sSx{l+2!KpFd=@W6w^UVvFGhBGv?}u(3X$4T!IW!gD_q1v7;WbqRkN zQQk6;f-oC+;D4K`4ypIMOj6Y8jT#{>xoX3YfB{5y8tveIbL;X-g%1NC`a1}E#Dk(1 zaI2+*>37W14@SUPx1@5&&*WpLZEebIQY!i0d}6MH)OEOt4P)oM4Tqjf>4vgt5qiuz(3oYmY#D&DAoR?t z<6d?xl`Gm2X#~C)ubGEqN_H=rmkK7s#h}^wevY%FjcHI5n!LC{xqK^6Q{#2ssAdWYKAF4hqi*BALy4Fkn)XHO8EpWfV2nqGm4f4yJ!_ zC%kk)VLbLg4I=*SoTjUJc*;cWJSLGn>}NZ@JH%H?JMu>Dv0SXnf9yM;Kjaamom%H% z6&jgeNn9f`B}BbyrCT5FYVo;()-cuo1%2r?SdZJd?^Dl~zHbI1{r*q@R%^}arkJn% zILS#Rz$0hV8Y)9rX@ex3u}s9?pQD=spn=AtTW|?IzY0StFp>~Af}{ulqnZCG+av%c z6oNyD(JHNTqy+##0Bbb6pG0`ndXwm46#t(2D;YH}?$5gx`+MK}BO&xMU&{o1#($M@ z9;tBf`bIvh!s+V!ZMN~Ac(k8PWhG9ZVaib|K~P3Bx?G8S;<%|KQqnM{r5;xN{n2^0 zRJKVM$@E5GtQNicsXtmuP+A_0fdi%?_$tLD9856y>X`^d>Epi`1^kT1qX}`)eVR_fOu6z=l;GyBgADazTu4YbOw@&2 zez!w#W!zi+C~=fLzQm$uqNkt1e72qkr+vG-r}xkY0INa(x!C1ISTz=9z!--<^L(zO zLsaXDwk?QWn$8{U>$;z9@G%oMi;Q{f9jWi8g=0X{{~r+rK9#DL-&_Y|9yri;o*7a~ z_7+*++NyT4v^D~&)>B6XBN-03`a4=cQbOH{HGak&E|XrXY0(FDBDJKDVYr6%JsIif zNSjN?$Vj%-g=x(e!4!kO6>6t8l6xHB#jIPM-a!Hb4C>Cuct01P-Bg|__hjHu+ayM@ z(hoC)Dp#?Nesv z<7P99sl8DnQ3(XaSe4(VRAgW{7~eu?wv(OJ=myHurV0VnUpi;@YUp-ivtyxid6M(8 z<}XHtT81JgLUiU^oSL5I1%}ivE2Gd{T6sYV<#bbh&?2)d< z$C5oytO#f;ahYN{fum*$D+9Y8%+XE~+zmC3#8Kjkj!m3G?hECUbm_znjqo?Z9Pz*I zYn?7Qcxy3mXsv-VnoCuQxx}{*fX3uUQk+SogJ#px#|6;L^dzGe)tac+g&M*lU`L-{ z8)SsaWio84nPzzx1vnj=gkl=2d%%Jvv?gFcUkV?8x1e<6WZAbe?8wz%L|_h7q$<4e zG2w?S7H_Rz`^y9Y5l*wKpK8Q$>P0(SL&+D?A(SZ6pchchkq48O*fz}+41?JpPVtVF zztl1brw;x1?l0EiKB&DLJD}XfoeVkgaSYk!hj_4) zoe-HQJA*)KP!gBf>YEJJpi1@ae+`>e#kE7W?ieDHM>g%=vt_@y=+E61K2vSUb{3s# zKe(%K;@!$W8iTwN@aVh_hQ!>{L4PHxRG}t%?9p@RaN%vz!hWfLir_8w2?P_jNIZ%s zD!%Zf)!j~}sNtiuJerUb{?j`b1cZXZZ8bIe%VNLNX7^JfV%r3~e!L;WHxZDVdr0QT z(ANvTBNBWEbRDTA7a}XFayVJyKgaBfOxG3WM81=^T^51iB<6lw`KM#hBw*#$-zomi zAhFb^NFQk#_|UUKy)eXulcN{iMpxViUC$X4i=0X;2v+R)8A6no)NamY%~ua6TRK@F z-AtZP={(qEO|9GP$*O33!#E$7b@CJ#S6i~p z@7){$lr@Zmzgp!l0hrBS;$(wjY282?NXylpHo41;*lSJ1Na98C{ueTyN%STs3wz5$ z987AKY{7g@(y|pF@5$AcI_*_Gl_dytk`k56_^sdMUm?q!=3!yKL+x|*)qv_sa*48uLot`>^UQi!Kc@qo4DC!L1xDYBkYru^3@F< z%aoO)hAZ=JMxx%IYk7tCb#9q<3+oV{l`MuSfEV)F67->PF%zeoAe<|M>SOy z{EXJ24%&4V@vSd(P7Ln-$tnGD9sGCH&*zY*Izh z@s~w4^ZNn2h(?unlxZ?e+LAZ_Up`^S9zCgSBCKD$_=@tp9{NVE$qw0I6yyxl2a!z! z?;5_^;ehDg=bsw9?w}y z3mjXe@Kaw#afGzi&&HVV0v#nxaqjvbs|4hi=69e40BY=zA0k(?8m_4vdR+({10Q`< zFIO+P{Z8d3aLd%(0dCh+mD_HMTm~>^H~7Foz!dC5!zrLm1%m;$*o%Tur8oJ6XnHEk zBBr|HwbKS_gnrKGPd2>!R^CTd{G%rIGtG3&TolaNvEfKB#-)vt5W`7?Gput%{Wq?- zmFQ}UFejc7iVF3QbI*S}zpPU-+zaZ#7V}2sn5^B2o!!rdHBR1V zoV7R$f1MS3&+>l1r(Cr##vM#S(+LMB4O744!5|Y(Wp#y#!NnH>W&fYG-R0rY!*?WO zPh($63~tm8ERo3*f--!irSPbI{gfKL@VvkFNU%iTK55hClZX{V$7#Gy2k(XNahX@{ zvF8}f=c@ced+!1_0K|Z}y+Y=O243F2+l+A_k41bs z!t@<$-6S7jx{OSr&iX>_*T5GOTC%5VbS*PmtqFIQ>U&qMf#Pe2+9Bs>&t*27Ei>!> zGI2Tl1H=sGh}}HnBbgHf+-xfbhCO~qJM#Q1Jl8(;DW0dV%%ur?>o7iQS^nm*Rxl1I z@M%X9>-0gM9X^qL)C}A_Y+ZRHg?iW6?oTwRNMWB8?r8fdRGmP<2T z!W2lpS<$_YqXFVLiX5|Z7nx6I;m-YejUpL`6r^2ENPZg3G#|QyN$YDJOgt_`z;j0H)Sj4zj)D?q-xvK*@SAKOejdIP96k~8 zK}^5*v_o52XA%DYn(X!%`khBV=EI@)@U^kcuw#!azE0Kz4^qyBLCtz}PdR8oJni*F zLy}2oI!HH!*8mHZZ^%XXmtwK<`e$y(FE>i$ z9`&`wEcB>AZxsr7Ev{#7W_c(f`_1WWY^UxEUPtUucAUH;PDTtx*Q+J!Dq|_n`p0Rm zTvdk!?I5>5b-YuNWOc$yOk`%e?C7Qx#YewMurlF9_j9{fpoA=IJz1bXInMGqtyHc& z*9&cyYpnY#1^F17u~TV8`{>|GZ27#)^E^*6D0<=VYQ#S=ZLb0D#Y#n^ax~#I9Oj`y zbDT|Ma$q3q;1S+hcOpAJ_lDSIt@cc>iLGxCFk&&{(DyZBjA+yE5I7^6*_cI*Z3Q71 zvd-$ihFf;W_H_z|=5ZYdISAUWbyjI-F4OHwsmde%pV1~Km&xb(Xb5vk@kOj2pC|D4 zwZMVheE7;)OfMBsb}Z5ZPJ1QKHJH2-jcUrda3X{LfJjePx(`h3r9blp>r!D&WbNnd zrXBYsaAzn?x5||o{bni)W0US0)Vkc>wVv4GUbbQl9E7!^c7RKdP~46Z0#gnow8(kD zOcsI6Ll5^VtVl+&91WhY$B0T!6$;%|v01wT7)*G&psM<0oV9{Hjggpybsl`Gi@;al z5DxA#@tB{UzN!hJe+*6$QcV1AS=7%lZTL86A+szQX~HQ(Cvtq_+}N%!KE#34pZ{&= z_Dd2e-r>rnPB18U4iSep+c2tsZLjZwD+Y_9Fv_p@yL;Hts!Biel=XJ$Rcg_Ra4+&k z{SzWS8HrOW+&+3jg6n1>+iM9`{74E1qWr$?Ay_$02kszFk`g!&Dwc`X>fSO^%`Y)#(~E@V17GJ;zuV|0lC4-cTlQ=11p||6MYjnx%;+K;`}50@Ldc*& zs5cQWVh;VnrN`hDJ6)82$^srXKXd<2mBeB!hxcWJzzm zGo*Px+W&c}#=E-27=wJsz5(SkN{-eBn<$7JsWxOL|Jk&9?}Ql6nlW=H^Dtg^>0kis3T=J1hUT!oZLkp9JI? zs-4jjT}tGDsz*K1-v}Etjhj;=2un*z@t?CkuRWpOK^p%BrPjxCynOb;;)y_I3^p1E zYWnB)CR;5JprLVoFAY6ZHl&NzQsl8)TFJ2IGAnxB2~=8D`?cfgz|7@Ja2FJ}!ub_? zPCW(n62ic#4a*PE_NJ&~8~g5!638xc7G+Nr4SV#`v1vg>UZ%C`+eI+T&IxS~GJyrbY14c@hkc6Dd9lLTA%-b5F-}7&Kq1Rn+N=B;>Of zQ$MW2OHxHQ!FT%?92I|9rXi2m7$%rGLr)Mb zqLXxOYRTh+i=PxKIPNOyIQ_h~mWy%90>`48d(%*sJ(e-}4{+qV{^w7NF#uL1bV%ep z4*jVi6kmW<%DyDvHQi2SMks{Xh>5V9+#EL7eHZQjE)3%t-Y_gjIkn_g}lpnd%9D zo#=f-tn7N6gv--EEhlBIt9WoiAnDTPtQ!&u8>LNz`%ldwNZf2Mw)7+hEVN7MnPX{Hj)1P z!{xwlP&n9=5NR;;B>OUlUV+`E%A?eP%tb&R!Fh`^1J84GoAm?uS#xd9ubX(5Ue)li z>*Tmd`P>P{TV?IQWDA9<0yCrbLxzn(t=#naVmDocr>L3yER&B`1-~6Fwl0DXu|mg+Kvm=KeY7B?DffWH@uC{_SB@`y$ARA0E8KwY;lev0l^WEZf7irY(pv_ zow|dyn};-;Jha_EeDp{uIoB7C)uO<}Wo(oQSnd;%!I1nj?~G2!FXca)J-BXNACT~; zSKn+}GtsS6FF6A=@|H)Xw>^TN=?U6QYQEow%+Cy*x|B3bvvb8j%M~_pMHeVc1lp^-P^0}+{-dx@+ zb5)P%(i(x>R_k$mt())0gJ$Utt=Fks4O$D02&)JDL?Aq*YhP0tI-FfZb6R!m}xhBkv`4DS>Y0-}54Evu*d!mG&upOlE zj1@jyd zo)-Mn?{IB_D#_%q`~FnT1?vI5f3OuXzY6f|6?RZrjd$5t%Wy!T>Gt_AGfEPD@WPtj z50P09j!>|bZJV5N+W0C4QQ8p2+k)@X2^?w$jxp9{5J$BC{-!&09#zrBA~|lzE<2nQ z&BtoqbZm)|*pn{Q0Dx<{Cql4CD2`25-C@U}%OAl9_6>n}Sym}w*8axhCrL*uFM5Kz8(Q7cjxfB6E`0u$QP8A}hPM;Lu z-J}yM{zMB-;ChNqpyKeev6v8${Flv$vlmK~wH6B}9pKT@MLX4+Z8PjUcbxFqJ`-E8 z1A8Q=cD|})?LK$60@lpuI2HEN*Kxrp%uyJgtOHHzTT)~%sT1qJYXgu_t3Ut|F>Q|zaYSG;j6r%R zilt3dJkwBx$s*@wYudKOFZ%FqGM9ghWCeia?DEQN-Mi@*lP>@});NT*eohT~Gh*UI z(q623iY&_(8oq_+aKGOuc}RGBHtsvLVVsS4Imz4h`6W;0(zDF3^mPApN$GKvyqx(E z-b-^wy635=IUy3u4A4|vGxwUdp1D-NcYmg`@jC5h-|@i}LEpPqp_f^a zV~cvjpgbVQj*!y7bj?Yr=VRA7csWD+uD2lcS7Z~XQ=xRgKMTmlObZn(mq47-wy2c*BOMnEnew^)DY;eFBQJdT!9@8*;OWJl@Hl;*AUK@&s_BOcW>nTK1@7#knBOdS4bmg7}#yZ#p>d7`lIWi^ykU z`&BbdSCC0Cou0j+WF!Dk2PXM8jsgXgHbh5%GUt(}bh#!L(E3o9QKIzO9H1tg4@n}q zE1ZT*gRK_+RCJezo*`JAEJ3hn%gDjB#QjB?0vlir`qY@Hac?%5#6{ zt5yK*=!Q6dnf?w&cQ13R6BCwFmcA5OF2pua4YhxAjmTNVr2t^3W3R&0CFwAt#M!B? z>rW`K_k+R%hRw`?Zcwk))H4V*F8;V+fQphrWNsMLP_@ddmT*eaWNdQ0gIH$yr>6F* z+&(z}>Kj|+^kMi2a6(P-zg&oT^?v1Zc9N46Hbyq!Ys&@qv~0{mwL=C)vcAZ63*W4T z5V{4zviB?Ix311+Qw=?S-*;4<$m=;ft9#ON6Y`|MR-Z07f8hsSN4$Y`N%|7TFHU`j?1(_3&lFGb3_% z3%j-+4tWhFmM@vXX~kdOP;+l2+AK~-77Syn=y!OuvW1r*GL@PAj;x5p_u?<6M99|+ z_5`k8GRl~!tGsFCm5;$0(SA2{e!n57i~rRbvxD&G8;L(#-|Aaee@6`Q( zE`%bP1ucS2ZRI>$ui#9wQTmI0Hv-=q%K4=+)qB*}86%^vIlU0Ck~JWts%Fuxff4zF z4gi7Xj^^oVJZBnJW9AOBA>2D}O=_cWl$&$XQr_!!pLDt**m6n7`53bB9e7)bhF!L)FIb0(#Qb z0TKekJ9Nqz=P|%7$8W8KWjXx)!@+Vmh=Bnh3=F%D&<+J?vFJp5{4KW_$QP8AY3H~E zK9K}?S;HMO#>P6t|zw_6_Gd&G0DwR5}#Bvz>dO& z_!NM&M`Hzp%UL_oeoc#T!$_u)Q+1OjhwGKD@ir@+2y$rdW-6M~^wwU$JhHz)GE5oY zdX!tDJ71(_(mWTEy$uW}$y`%N^4MU}GrK8em2M2q01x=nY{MB^-nSfotE)vhfavKz zLLp?AgIAe)9c&_OT1Iy+gq(I?8C5$U+;W^A#QXWOg3p$t-IwMa)qr75g?lV^a>kYu zp7fMfMHt}eu3d1qO+e&$E*j6H(WV%^*ln@_cHo)*YjQrF4?+S_wmAaVh`gY*Xnzbn zyI%?6Ql*;zH2<0$y;m05fU|P<&U`nvIbV}ZA z1}@SNdOEgF^)g&BAR1X_O)7w7t^q(s1wSY`uA)NKgEWnPn@J>h#T`n*~pR7h%r9FwWY|j~0 zZ7t}Y^*S;g7QJcjeoZE?ZgMMuS0W1m!GBBkJX~oR8w4LpBoW4yPS z0=9RM{kkP1ql;NO?un1=RVZ_Cr(X+rkWD4FZCDC%X3*E*Mv|9e=(u*CQ`D-|q1PI{6tq)Qs8F`5><+J)Fj?$bbvW1_R4lfwzQ|>4|EH>nw1P68dUB?=#**zqVwd4SarT8USLb0K!*WoZ_M4+S;e| z3b&KtBCpOaqGwqRy+-=`R0OE!*8{Q=m-cMlu=S>dLdU8oa_*w{1QbU=oEu;G%6c%T z(MG?SE)Suym95sqJ9B})o7R2dEr?9lc6yEqgI%S^gI8Cl;nS$*BVk zv}>TANtxGZTo|joOxH-5E977UwDn4P3V#3t?M*bm168b>w%f|$dqkECaU_ggN-%d+ zGo-@wQgpdZo5Mbg)#Z${>5aW!+EMtbHWObb#ZL5>`&UnM*|7rt{~NXd_Ye~)0cs&; zYm*V8;N4A~THy?DleSESXPNXIBbC&6>aA}KHD@yRH{l@Wu;NiOSWJP079@4gOSGN- zN9plLBU7z=@K}lW?los8wHSq!_lt~1?MS07LuY5J<^&eWC^aE{d#VhbH~gZKk(Ze~ zdn^FHPx8lyoT@epl3^BS1A0gI{HNJq_HG_|K^Uf{!|s3;SlI>M)~TYU?frmQ7v%#N z0Uwq3;9U3793cuN%+OMqyi_FBh}<1{LJxF%)dvp4lv?t1a@Cz(s*cKk8F!$u4RU@#E{}QLdsrP!R<19=<5* ze=5*qb5KPnK{^*#YpSXz=VbG4c^%nE$v{t;fi+@=jSv@GbBdSQVg~OGL-VHp&hI?Z zd+4y*!ic)GA-k#vF{2JKu{%zoLL+(~HOmt!6F@_eeh2IllgxI87$iM*S0LI%t^?&t z^;!xb0uU7GgGT|~xF)As-(EGwpdD7~cIi5!gdOt1@r-rpjIUoj9H6A^$EjTH;u0^H zp?AFGhUgHrwxvl0BD~1&{FP7Uu^xdMohkPZ>#xv6^$s>xd$SlS^D57Qie_XutfBOi zM_^=v9K$OmQWxgQl9&^cl)Tz2&ewvXpImCFGhuRn{%)#4ouqrMDgAYR@A`RsF{?1( zyTjP;Q?Z$&7;SakXoDjZqkHweu{_-8+n>k?0StP|?2^g{MnH64j6(^SDFDZ8guDJ{woe7&7+-N50me0ip*fQ_>F&11Y}cU=vW46GOo5qs6x z@+EC}OKBdHfa3Ll+^9$RMiku2M8bAYc_w_DSNNq}bG>Hwt9dIz$t&TbNt`3%KO?(l4{l5?ukFY7OU`~ZSQ** zw90)UQ;$H84$W3*HaFsrIr)sQi=dZ9tX?1?q{}Wcv7F*SzoC7b30$-i0Yd=rHO3U# zj9)|$44HWyeU|F4M?`|i7={>P_P?}CWY1DBoYe>*jKw6RLN+{{@>j~sBo9W2UYe%E zzJPjj!K^Vnox*(#y`Pib&9$Q-*2it@h(&R&>n!x1Rp0R;;&3M996^}ZYZ7blG!))F zw(eObL-M=OZ*YF_p>eA`_mHm5zlwAU%e4BRi7+c^Bf+j=rZo@#(0kzjx`(5uEB9p=rFpCQgdkwc|Ld|>yx2sMPtw^c zhGb1P_FttaRV!R(dTe#JmQbUDD)P{PFzKaLo)TA-JRKlF*)O~QDxPUgu?Ek>O_>pN zX=K$`P4aB-qhJXV8MvDD?g-Jzx_MP#Xywa+^2pAejD%n{eymUzUD65*8D$$_`l8iC z3Qze!sGW*l{v2m_;8%5m5i85*!WzbMsALZ0BF26;5sk8=(W%?HKplhp0q^do0qvyE zbnc+tiU{1(J4)|?C7BtroUz-wWj-QmgUSkOE#H{C#r{b4{+C&> zVH3$^MBV{y%stpa5UQJKd3qGwTtuN`MoZeZ{)Gw}??Ajjx3K-wGwog3Zm*XJ*xGcq z=!cl>Y%OrEgWm&1(jJT3k8lt95+20Iks+Z7#TpbLS3$^YFAAckKCowSU}9fbq5$5} zcvlgRHAp%~69SCD%S&=Si+BMpul@I9N|YSkywV~$ASK9c)d~@82zC*ZvE1kmTnpmWR*+&gTN3(K$>)uz{_o+R|(iIAQ${={~{ zH;33>Z+3d}V#H2uUpO%LeCLucU(%jCFE~yu6*m#fR$qh7`dQP)PLpk^G-oq9QwKW9%_~#ix{raEkrMRFU#q zGnH)sWDR9EGh$eK_4m5!QP@fE2B{jIkoZX;JI36kJf8<0qi@@?(%CGh1exMC1qmIQ zQ6zYt`p>n2LS(L?h1B_KzKD22YPtOeTT{-NWz$xu`er-(Y;J8NyKY_)z$nlorS0Y? zy~wDE@r8!{=LVq=1BowaU{<-UZ~!uj6vh{7oWqz ztmwn-WSb6q>9^7%&cIf zn3CJ#vTv3l7XAi@YlvPD@=0Mu+D~oKgKMe)=o{m^mlHATvMQ5cexBg=Mh}XqRcBVJ zltkm&K(}{b6pX)F9PR>h-3TtC*Z@S(2m7oS`Oy9)GI-&~C2kEMGB1&xJ6%y*W0cH_JS)B8Y z<6*z;F#(Gq)Hs>9Z=qvI*l=m~DD9n(%4r~Ao0_Mh1G8Aat;#QI(eMCp_LGYS<;}sk zJM__@1K(h$jR^K6xga8GmWHr{!5QOfjc(Z%c~(&FLMnK2pO#OGYfcb%c(e3Bu$ z7&ZMx)mZQQeAa9C0s5(-Q3E(Vk)flIAo`;=X@d5#Srm}3P21oIpCl#b`!A>`@#`CJ zW)(cXUWX2MkC%lpB!P^k3M*$UJnimq@3lKvoVk0`2ROh4zB76pRm9!@T-ZDcYo5!C zAak#Xd1NfdvBg=8m+=!jvu~Z(x&tQ`7eFfPf~$uyj?Fo_@5izxSGC~uI`GOy0a6u# zhSP^E4=}eq)BOwiN#iE#BMFtZ!lh9$W6@*qm2>sSI?6AJXZ|M8%OGnplT`wxCj(=;s?Dr;M3SV z9%)K%7dZN0r!`Q?XB6t@5%BtR3Im5?(y#YV9&Q(EYno)7OL3W)J#Xb>_}QlH8LrrO zo_r>tt^Mutc<*HQG*d=E314CB_G;PeVSRDr!OeT2GQ=n_HoEtZ$J!u0-;auL%cBM& zN^Pv}>Ik&2nE)Nafc5_6965qRS>DcrisHjLoSy`*}=)^E+ z{fk8&gwK*Xa<%+Fa>S*VM@Mh4LD(k-+mA^<;>Uk&UziF}X@@o+VJDgXB9dyCs!}&4 zdfF?S5gL$aGwF9(B22}5UC9c%DDT{w$rt;AHuBezz+U2wK6>J9jH`Y<(i3 z=9A~3%SzU>tnLF=IEm#tG9Z;3`Z{ilVRn}FT0!!0F~xMf$slJS#?Je`M8!`eeV3>BpFLmPnt1`(?2o8*zf5lm_t1fVgi;Wt|xf z1dilc#NK-MSIipZ@NUu8xENuRN^)y|R|lp@wBH=3G@_UKl_UQrG0eR{W$O@LpQwD_ z!^35yr5&H9MR$g!NcqQLP&Zp7%j3+%ht@vXTL4fdkF}&7D!7%?TUt4Yc_U)MiOO(-gB) zw)Es@o5MH}h(kxcdWPi62}`dZgg$UC_T}Nmw{2Beg=Xd>oozXkGOk#?l0uu|+g>p3 zH@ty9mwp#zg$_Qh^MD9NxO^KVFwC50HFT$GjjHNzl6mEUyH=upcX>PLmMIWcnpQN6 zpD?Ud-#o|s*uA?GW`jYE26+bU;V8O1vl8}={UF&Mt5amWkY6;0+WP7`=|f&xeAI04 zjEE33CU>CuJ>B-D8=pdKwkb`^7u8i@#F=at+6_na>xNrF@1Rje;&jvIC5l1{hMLY? zv7mb7m#FaJ)?F0NgzQ98o}eQvMV%wwzu$`q|LS-Upt?ltp?v#{M&$24L2_ zZC<@kL?k0exmQO%^31N4LM!wYT$59b8mbyN-=hLdHiso%_Kc-K5ZZMu(@Sp&tiqlK z7377Eu@ms^tv;uW4;xR$SFH|wki*e;+t(%!S8k~IHlPtnCxGW)?)$?+NXW@vkg#Mzl(wAK}O5S1xTm@!kvYlcUAyZ}IJ2h?$ zp;jV1AlbFaHiSHvFw-L>Rv2@$$CCLaBYct0=Iw4|Qc0Xkt88s*ng*bvB5#N8AG|QT z=0FIPV{%nE>iXDa6m0(n++g-P3T!RBS5AV;(*K7r4#!X*vQti1%GsK$Q*EaT+pbg5 zPS%D=B57MxZa||D91O~tQP|5D42`pi;u2?VMPW#YgE;)zjqN&c7?F*hfxD74(?pInXJN63sWs zGK_wrcJ0M$GGP7w#~#Ia1senp-)3o@8hJd^oAvHx$U(#TgESv#^(Ea1l%U)TCLI+m zbT_CZU|kU_Xsb9S4C74_dQfa;-gpWTWVDaN2D`G-n<%MJCAA|=bYZncoskDftrlP{ z0SLJ}n>&l*mp-?Ga`bPpAnC2%&MM!spv*+bme;`roBY8WFK|# zqD_VAjNnoxc|Z1|OpF}6$yd;~>e$dpC3W%U>!-)Vs)?5cKyVnRGz!FM&c5Hm89oBv z8_yX2-Nb~>mb~EK+}4W z^Z?T#9z25`+)e@JLf!i1XLXFz`e2^Sg&dBIRN{&m;|U9|Wlo*SXUp;-2^s$VUUHV{ zZyDiH{C~GdP* zud*l6K&Kg-p#0vyUiw~JMph|ZETO2Y{H;Dx92XWSc-|Q=NMmU6VjdHAN*oSt{; zmgJ|~-h|&xJ!rh6Ag8RTTPLrU!weia38o;shOVth03|@$zifm%nuJ-{cM5N3xYiz$ z-&YpZ_3Mb?CLIQ`W;u;@f)}KEBxw_8fr)o!$^SPZzbT`kMdw|g&JOeAm-Jgq^6m~oC$dW?PG+cNIt|J*TUVxSekvxML*iSbDm#R?-gSogCN5BDVHYbUg z+#Xx545`~PBO;ut@l5I4bGWR15!wHvZ+2!_t>XS|w}9Q!IK+h1jARvm{|UwW5A<^2 zttRj+cg!^H+zz40t3+Y)yl`|R?aT$@F*sA zVl5&XPiESlqjXPFUSwW7-R(K8O`2ZsoBfo@j-LD9xb1G@Q*{+xih3ME=O4bw>P+X{ zqA8I^3e#L1Z>>>aGhYRB~rB3G|+^X$WSC)O5Y!E;&qW^pO041_NS6?7i z&G;S(>AQAy{5RwQ@Izb9M|`ot$EqC~Q^32fKr0C1$6$3j10Orvy_)ni=v*+&Vaz>B z(z80S-r%Y#^X1L~h6wHod zVIDf%{?T}^i-74`ImNTn5L&GuYY_A2z8pYooDI+BqA;3&^olp#Bv`T!e`)E;qL=>_ zKbALkJW7XXKi0;j3IOJUU&gfHREg8K+Aml8swS9NuD@r8q!Zd6^h_dGg;V7L0&<3A zf{Ep2P})~!#bwz>zD+B`_MTg0l9%-G@%Eee#)s$C1)zu2@A`du=2ZSt31-I@IDG{v zC?Tw!ow@x9hZn!cW6|hFW|&_QFvq6pP;AGEU;b8tHAusPowI5 z`xG95^AtckOTLb)DbqpqvM=T5c-w`x8JpH8QB=*T^)D(3AYZ{k!k_}DJYnJ-1oDs> zu^EG%|4~P>G;G!`;yW^yS&BM%h?%Z~hqbmv0OQu4e~%x#2TAfLuZpiJp%aM`&vBB$ zPYj>kG9Xx#@29c$q3F&1jkpW?nA+k|O9a@}*GJKnPswm~0W+_BENV@@B*=HOsRCcr zS;kSlCUYUTB#AZk`mrRWNP7cCKbwgODY~?sV+0K{){$)dd%4{tcPjDY6!19w88Vzi z+-&cMu<;=roExEeKdSm3%6gN)^um!)1 zaZr`7m!9>&*a#Kq`hP8Kyze6p4GGmRkjN^waHr1=lRykD+bqs#6DWe3q3th+!o`T6 zU>FB5w~g@a65JJKz)+lQ)$9)V+X#-&YMC5-SOkL4?WB(&ncFM@zIM_fwjODF@8qx^ zD#{*(tbXC;$zl0}ZBoPs+y6EIQH8*)Q*dH{V#s=bXIY|?S~7yTgQ9<~J<9qK>i>D& z9-6yKDWc7fc4~H@ljR`Gpbb~dS+xsDEDJO$(x^G}+_T}(l!1zlEIA^9Gp7VjEMcJ>C2~5Ices?CEFl%c z0_fz!&83$dy}@R%3p&DoTc5}8yJMI(eXo=*Pz4mMrCF#?Ng(m4OB||qSpVs? zD1N&j^w{jLJej!jkhC~4xf|E1O}Jt!|DlyIXaU2D1o6v0Vj!MO3nLqpKIab);~w$S zGfX{xA4EeTrkQsyqbCB+R2xizjzo=|#(S~MV(M{RG{2|A2H*Z5yk~ZH2=G#}AhIPU z5r5AxPZ_R1<5$Rzc3_nAZFstn#2?2+{FWmL`uP(@R4SvlxJTC}B;{Nd<_i2WOm7pz zuU=Y&DNA;YqFY=G0`plmbYrzgq88_y(Fk4W^_+9*gI6^VR;1L)((^>R0u|XL=MZEF z^z|@Cxv*yF2U;h>k>F@W<}xqSjpalDfkAtpfq0gaR$W%P_bL?6xyvGcL^?$3=wiH& z?_vG7MFD#t=eAqC#2OEUPLHnKu|JxHXTCMsq@J6DsHD1m>o|jPfJ4TGI(I9<-euY_ zY}P+~LS5#H!UuWx4-8%3QYZqO>2Aog6O>FjVU_!qma6d?uy|XmU8Op|IciC!z67Qj zSl_65%N zMM8xWswj{L2_bIBCn7mP4E~O`@Okk>=s3=bv%qrj-8_Hy*LYAkffon`8>fiS!1Je8 zHtd5i8P17a)3QgRJaaGW)XQ=cLng_{@5;(d>0+|4+s-yMF~n*{Oo1!?r4Iez-NvBG z;tAYrJarI?g2dZJLalb3BAnf!){XN!mrWX!7YQRvNM`%Hflmsgn<75s+=ky~G!j~b z?H$1|X}RLiG%OW_$Gc>pC|fgwx1xjZ zckMZQ+0#x-BxYz9b?Dvq_^X2k5x%(`)(}=%Rh*AiPJl|35;m`NPGSrk1T*jk61nSDX3 zy$>pchP#&<BBOGI{@KyfGcexHJ&6PXV$%hEOP4{PNNv%o3kN zoWd+P9uF&LrQ|EYJK-2nloyn6@HSI>(QTd7MCu-!;h&EkJ(F2rc8i2@c1d-bbI9Q{z#rOEP*gtR73)>UIGuy@uyVEr9tx?M=mdIY|8LUeHAXUm$ zLA`qL!U8X&F3f;8GZQ1wVNr{;!SjH1{fiq|JP=MaRBPEBZ;@CXmg2%_2}V@@e3UEP zytEvPJB}G<8B=89Jn}_0dp6JsZPnz{(thvwV7lgoPPf?_gK>y$J9Cnm|I#I9${DwE zQOPD&;kOo=d8$+;HDZ3~}r&*dV7WvXGn)mfBQNKKs z+sOW+F-MM|_4+ck+CPIH06OhrkMj$)LxjhMGpbnZsGL`y=(zP=jCpRH_7-CwZWRkM zR#oJlNiY7HoRLoy~tPe#+@trDW11avWYso7s>EUAHYX=uwGr9zI+PjSh9K> zT(S6B-?VIW8|N5jf*t|a-MOYFeKN`>I=^_>FgW=v{mTdt3j`@<4^Me%VEotOI(auy z(^M2}ymun1)0+yDPK1i4j|Ve9l*WzAkn~&|5J~s4-J^4A{x0gUVCU-_&`A0%Y-R`F z&%F$=(~pFqj?ocaVD*PEP~h4N2V>Lj2+{kYVXZhwl;PPx^npSp01neK)1+Cf_vsjZIilo_s=6F z<&;CThWMeNbd%RIt*zX6y7ar-?_b!f8uo8U9z#=cyerY+%qr|4THDoSduC&|&>UF7 z%MT%JC^u;a!baq-b4JS7y%#bhAiAzS7bJC}f}Kh}^c2=o<_%l{0h-hD#1zb2pLGxQ z6Hs0VbIl)>Vq=v-D(9N1UW3|0e90_g z#oBIOBu=o>%P71FN>;{_A|}qfmzoZJ?+ke?QhMlotosU*(B%9CNJLm6M=|2NIiXO| z*jBd;#J_ni^0l{-`iHM|gYWxZ9HPKSR%fr94DtIk)f#Hc6WvHDL*Mxt7+<%!6nUu~ zKL?bKnv#gpjfnc??{@D_G%*N~H1lN-)A^Fu8H(5CSEy8Bzr|QV6G2zDx229Vkh_vPLLzcqQ zqWP#}h8CAcHuW6%wL*tTN)ER)cPW+zZ&Do9cM$*tUz+VxLZNiDfU`fIYGOP zDLMkROcs>h{Yi!jv6*6bHMV@r))7Q|y72I!HrR4Lb6q*@WhSc?INLkGYD! zR#P1bS@{Os4>fpVk!LDeO(b%+X(i9J8V)gC>A9Tp=+9~psd-q)Wbvq1fAkbVmJh!U zis7)d1g$bw7X=o5uaO(;wLXdB{4>5q%vT$I0{a@dzx*9>>_ z>QmsVvetA9IJa5Rlj(aMTHUYVcJSI!8t}(H9&h{RO_@Kfov67CZbY7k*?8tmISLxU zPmf>n^X-e*@#${05M1nfx5)@z>wXjbw_z!QaOw)q3W`9mg~a;X4R41*hoYXVZ!`Is zb)Q{qc-So%S%olQNOdConFDXw|2y*J_|TF@LUQX}mHXh87YUPxHd5cN{g^`ua8XBy z2rrDt(1d&d`Ki#;Ykfg+QE@7)zzS~CG0rKenyReaad!*;C%ymtIXLJd8WIQ@-05d1 zTQX$6LNBJhBJ{%(C0^%)t@<*W4(NZgZl!sm~@G|It`R3*zF5>R_<#c-wIrhK&wXjFf6P(Vg< z+v^a0-GF0eYzJs&+1g&sNc}@Pj(DvxRNf$hAbN>lBuN}li82bl0CZ@Z3{jv;$VFdX z-Fu6nXt%J>b-R(evtQ)G;I~5TA-TVYBd^K()@ZVNjGf)yy7!MClxttzlMH`|rW?Rz z%3L(DLmD0(uideKvm!L8m_kA@C%|@z))v!-*UHW7D!82=uK8XFGhW;y!sk|RUnikJ zGvOc9lW6~jsen1f`WbKEmP@DMWZO-MTPrVMGEj!(>-YQgi1ka=?;aONvtYNBc!;My zaa@?aMYW1-IXh4GlhUeyKgxzCVrIta%2aOQ^jWumpSz6UL9wCimO0KBi0uI0n@8l6 z1O51g;$O;?{I#`;3fONji!x8_y0MIs?9@qklT3M-Qmd$p;4vvGA;?6SU#=tQ`LU@03Y@{cnX3yYd z8MYUJ`495Q1la?5%JYpwYCt!it9w3^1MdMLRVdUTM9rvts}eNJ?jJJtlZtv0^tOY= zDi#d-1_!>0d(DAkV!oSlM=f5UZ+)<<( z@sZFXR)v~A;g*zjE?o#}HD6H2cuhQGqF9`cKLSV~F-tCVo$To9^IEd!+qtm3JVH&N zJqs25Rze5XHuLTnKgwG{co}ZVR=eGI~JLgJSUYqKWdvTe%FnNq94sN^o&L(4orbUipc&od+qF-V$SWfWjn2 z()P81=6%z(;mY8LFitX${JC{R^36^EWSa5N>3aA@_DbTU9DG-jl&M2c&uIu49ZZ`r z{S1EC>3=7Xvy*Ss+gnCLWBi{CsK1oOW~xH#mQW9-Ne+h>WeCyD7y#&|2KFM#S|C%eH5#7xYV5E z2`f@@xqIfjXBfEd`PJ=iD6D{@74t4f3+pmq9EW!w+-G|ArS;l+yKTGcWMHc-ZvR=U z_fq8c-}hV0mHE9`tOK&+<=m<%=p^S0o)#_f1E~j{8c~^e zu$Qtn=xOa?q^<0;bN8L)6u5q$G}t!AMFRTryOr|%L6%OPQ|l^PrZQ`K>R=)0y=_v- zGYjOK^>}d$>@K2knw{uZ?Td&p?+?(gXmDSGpxA>rb$qi^LbV$OpIIeKG9|;qaDMxa z?NN9D}9+l({&2Ff{mv5F^t$GumGTfo;A#4Wbj5z z!dX&IrIxL%8sP#9%YrDtdX-BPmZ**FRRB4`559R!z0kBhgsOP4d?Xgw)=lzrhd+!@ z!M_EaoNgLNZYBdM$yV4))?y%46}6A&tKdbCdT80YL?C@Dqqi1`+S8k$VmD=>i+zOI zZ|BKVT$C}m2-wku>zEcHqTT;`*`(vz(G1lL>gC+KrWyVA38)g^^FlJKNL)cf;$+vHw_q z>XQZCVzPR1>8MhSdYT<3w}cC*q@6X&gJhGBC4!wYQNeSmtKgua*S z{=8vr?z0%PM-+i}Ay<8p$%bVVVqNTA{#yu8vKC}U~mOhwx|t{I^DOp3>rXjiGt{) zsZl%%utNcw&$*An6GzR7;rddu*MV7!&w!^bp-$N7C75W{{wpc5ZbiacQ&+ki>a&D& zZX?nftu6!a#43_|{;t(m-&FX1OkvOryXT*B)9B^&&D=4b5 z-$#;Ns0qpHz-8I`H4rs4iw{Ha@#G?Qk>>y2MDa%y3!~;adBR_n=)7hYz~{IX9c~g@ zpmEE(S3O(zr_7zNGtg1OO6hYX3rIvd(;c8I7xu04t>i!71b6qMcUx0@0)XF&D<(~P z=VeJxqI3K2&H9fen4-sFaeJJjZ5}t;lh*u|c74Mk>51IC&Te|Jbd?BQZ-GEZy(BB{ zppc#HhFLzS=69KxN_BP|jQk;jk-X*`Q(PUO*=yYoc@5ajwKbBGsKi1UP{$Tm8xY+y z!h;M!hkRy1Pvs_n=oy{nluGQVbJ9A|KB=fx*LNP}2pMTeUsGnXUONFqejkCztLzeX zM{ZV5WNC3!yZk(IXS;haZ;4a%W{PbhbC6zwdbXElb_<3rIX9` z*A(fkb!`sy-@@$S?#}O_y)X1on7<}ff$4RW&)E0~>z|HY+k>8dk$6|hEy+~fzITfe z`Vd3{sHCIq7-e>cvBS!RwY9*z#M(potLYW?P>?A(Nf#AB<+4f6+FB*B^=Ojrk^uy( zOL#PSlZo$kC?baY;jFwRDRQxTy$B%XQ0sFa;21cH)hVd!*c`wxj+e`@DR6T2n5+E( zJ5_;r$xaf0g~i%({xZ0zX)F#IXN^S7a_nqs^U3XB0GQhuLs^I;OUPys87R$4x+ntT0ME*7bFiMmB^9vP z<3^rtuCx7{yvcbXmG1#h`ht(gLK_U+<*SrQ?5CU)Jv6+**Wh88L8 zKaSd#HHD(~>_C%9Ui=fCw}HaKbIaWClj@2re?o?<80uC3y|5*`UWY)_D!N2Hu52Uy zy0)-!`ue(^|DWF(?z@p!ay};K`AeN|EDmu;{6q>^zfttK$5{#t661Ob^*}uv{3Rgl zQJ<8;9d_y^q)U`-Rnk4R4jD#2n4Jz2z<&5$mSWsP&!bm+jj|Z1N{f9l=Gc{81o~LW|CB@hz2kKT@YQCJ# zIqTnx?BRfYIfxg!2QW+4t$Xk|t_AIC{9MZhkG_BMGa|LuGHG`-HPsVguK_v>Y(jAV z#66eHa()-J6VQ&K%alVFB`GaEbtzd58Rj+0R!n**jZ(;-`Bh?cAU$e%fdzt8a6zwj zqg2Smgb%%FD)NH$QuA@a$Cd=<6LL&PO9%)TE2U=VT>Ek5htz3~U(+lp-_$)PB%&`v zUbKP+digC7GmwS7uhta3m*i730yqUq>7xGmPRW$mDU~$Hj2a3Aq z@!{^$9~g-|3bTnQkhqFzi34es(%-cV5OP$z;WCr)d831+0i;T6R#*!uK2`d}R>Xwp3K6^uP&B3^ z!9=x2sudvm+oV#4#TWtwy##zL@vYc(JA%8`CKg^1Rd7DvQrBg1XMK}9mz}7ovAGCd zxXAnTuWQ2uwS1TGS?+8Jq5o(=BjB7;t_laBy)G(dh&>@R7Gw~DX)9Idjtv{unpcyp!7t$U83u9Le~FXU(k!2lufxqDM{^t{xw_=87CFE zn-nWNoRY64U<`%}b+We6(~Rr$UMBZxH0{*sgmoH~Z;dEbu$+*=9p6m8CA5TywDAX0 zmYy;t@e+PWKPxYD{TZjkgu~D6vYdVn7QhwtD=`FyV_yNpJimcxw+kguD-#I(p4X+L z9;W?%Kldo`wv+y~`IX;Rg}#tcndhoCLI3o(qTmV%7PQqUgpkg0MvKYUjo6ZQCcn&B9#K` zfW;A~fZNpF0P9YBKj6Ig=OVl5v>*N{+Uj$-HypD|)yBb@byR(b7ahhbpFfzsxM2(2 zil#_lIY=3*3z$B`J`00%wKXgcDOn=ulGp7!^%9FtqcIlYUx%FI1du;A=O5(K+vQu< zK^T$z8Ya(*f|8+|0jaw{%DrWlNG57k&$&WJTHgU+rV@PFz5Mxw>nD_GoU27?>50FXk*JxdOaxNfW&4Y)9<9NAGV$_)m}be z6ckY1idPZN(?2ZgW#-;KR+}eeeHJfwsb!8=UL<8#?*bCS)=dah60|({x?qjRQxz5% zJWVSne-m1S?+(;Y!pg-d_-zjRh84X2hkY6?pydU$x>XwRs=41CgDCEhnM_^;k08p) z<>tZeklFIbVxdtO@YJ6KUD!Tf!Mgi0NQ$So@$z8LS&f2y!-)Fbt<*8P(c}_>U+> z<*$pS{uzlPktJX?U5}o-UM4oIUiB%nDuvG_p}C5Kdr?ZX^}lMNA=A_ZY(*cSRx#t- z3)iQuxSjNYJgR4clwLpjiY)is!kIZ6x{fHRn=MufcWde%Z{J2twx$ zHS0Bmnc!#08D8s@dNiLE;!Xfm)&ORqzap2vP4CbCy|WKZrG=blpM1+sTP~lqSI)wR zh8qsEQ;d_o5`=aGqENTq7Vhj!%*hPzp~;5oiL*uYiXd2#B)a6AG5At5g{!fO;FYjW zR~2`i-FMY|cZYP0MUNhLRr<*8?$?xqyd?BdsNQDpOQ6p^y%pF!S` z4ktvYc&kf~wQSGZ$APv^RZnjWk2PB5hT`8tS|B=O#JdH6qIkx!DVgik^y^)G5PurC;ZGpng^l*emv4wi7=%RYB0)l`G-ovH`+w3{E@e}p96kz zl6o)5KflAp=zgTlanB7tRlIPs-5MT*sAI;D(}K7#cpFXcK^z!&5OqDT2IZKvoX~Qt zXtD=fydM7dVfM{L5Dd(W8|Lb1*?c@>N_8!F=}wi8tC#q`eC68W!>#&GetOf^VC5m; zzwd-X<%Uqc0M^6*<4^Xbl)SJwx{Idt9U%>X+bg;&VXEL0a=hGMXdXFrMEAoI>L@bk z*!1Lp_RnUDzrpoiXKNCxlYlTWvPM`@ z$HvF@#Y&mlhf?1mVY$^WxsSN#f2+(A&l>JbdNy|S|Km9&A=P9TXx5G>%_#{BETI_h zYlxQUfhUPmUZt~Q?gl}&#{}|!+RH75d1ja`7(;&{UbB@}!kdV&DFN{ez!FQvDUgo) z_TY@Pb#W^Wgd}1JGk_0Yb-z~29DF;^$q-a#1$8}i<9${9X{v-e!CGWOj=I}h+tdZl zEi?TL(o5IGaod#opTxD@p|dEipDBS_=xs7XKNGrb^>I12WiJ{cYFBL2v%ZNh56)dB zJU)ML&8fM=;Rn-G6YCUpq_;b}qIQO{Hm?GJB?nzh#j<9Z>f z3Mf?ui(V~~7J=H@qZXPqbq6=)r5Qj&u8XaNBWdGcryYdtt90cN_-qn@bqHyZiO>8( zGe0X$+@F%!d!W)p>nD{v3*qL$FEf$B9x_4ouzT~4!Qow{Fi>GA4eiMxYKgtIetsbI zLzcj%oa>3YGa7grK1ODGX9|TQm4@$ zp6eMsr=8eIGI2hVm<1$>hq$h0#hyh-z(omL^&8141wY{KsJM!&3AMXtxu*;{l#HvP zV=!uvd8BVjB82O~OUJ+>I!Hl{7i+YQx(3gUKFCdS5`n6@BEH4#DjEaExn3lXZz@Y+ zDMC&4&Iq_AIH%wod@4T^<%%}yHQPmqnRT|RHsH;D`gTShiUYYn*|>z4F+Q=xM%lVw z=r!?er|FG3jlw)i!Y4_P-!o=yEK7p~6(!)E9@vtm++Ef2 zxkw4*?wNNX*(!(CeO7Z8HED#|!qJEN3cLJPZWI@j_K}(Fngy@WRNLS!bq%ytM_!2z z)!wsSUi(9)?|@9F#`8)#nm;d@65ZFn^n!E3)hfDJFIk7r2qZVyrv2x7Sh@d8OYsOX z@Y`Pbqr4%JX8SeEKH-~~<40%v$)1)0h`^m z`Q%vw85#@1RV}D(kpGe#-ozZ~Y}mv82$pVh1KpUStrU0TPfQL54MYZ39CGyZf=$n* zGuGHMPS4Yp7;no&{Py@yU{WTlp2Q=)f&Vtg8SXfG97zDL@$KQGW~}TKP$pVlW#F)& z-+Dvau(G13V$xnRyHd3zaKdGoZO6I_-~ltqPk%>#`Xz?VtbAntsXyo!kF4Z{7HME* z)c@s@KBM#V`QEs)CZ&){yL{~Psps~I4Wq02X2`bZ zi?A~Tv~6UMTG;5(vMHSN%Bwwkkv|wzs`$On^8iom9p}PF$Nrvs=RGuw#sj1-TB$~B zl=e0ZPPr=Y)|_t~E^ajVZFsBh!CD2oCIhEAD`Axg^F7G*OChS zWc7W5R7`!ebyvQln2RCWSupmfFK4BqW|_Y}P_oGU<`0y|BnBf3sTh?VGu1EmCuRYb z9Z)X@-gIrh5>ikN7OV|e?9)_;R+4OowrCb^orlhI;0A(L;B#l3EpPZmRn}1^3EJ+C zB~mw`0G$zGA=5bnkR|~A^Yki_M_xcAHoxHyZ1e+VlAj5vL>BbCeGg19f+ot@9nY-h*wV>6f;5|Y$&W?u= z=Z7cU(8a&$XpMEY+8nrlnS$=g=uGALOHWPaSLZE^NQ^)9=|tE26eC;xTP2;%El{jr zwD7WQ0CixAIpDOI6cgP?geGwGJXg6W@|#K|WWM_qb`3BS?DhUI42n#KpCphvM^L)l4<5o4(2SD?!Z0_ja!@J-Ix*F{B+pUY*bVoYB7?FSSbZ)g#Tj$G}z@9A=F_QGf(58l;Qz?VzM0heLRvW&6Er z`2-j^lu*rxoJ3Rv4o|=$rs6{oGQjE6c2fFsrXMXYW>R2Nyp=yKJ4BP}gw&z-P!=>} zrv|41aU9u|;x?`yoxNvBAeDxy$5(*!Gr}!5((Y$eym}fkuB*t!&U-nDkOE?$=hGJX z5v4%V5W1EHC(Z$w9X*{;WzWwEt_di;N%@J|5EI9Xfy!Sc^9gCdiiC&+Cwfx_Ix-_Q zXbsmrOg|DNepsPymp6Q_N8lpPJ@<$Hr^C8$+^3=!pShv=C0huzdFOL#rp+R8G$L2N zrX55)y$OlG;kF-zq$y-8AW(#Ga7nxlt(3ug8tb^b@>57+$%${0v3OH}NPY7im^{Ia z7C(VgNs;MK(N-rWbm^UbVmmerY=Han5l(!Mn%DCV+p{LATz(d|Kt?9_7u`%57pBLx zirYI=1qr?eK+ioQdh=3Zs?4}|Q|2+~+@cj(S;8In_Q8ws)tWeeBz1Hdc>)LcKW;M- zwMCBui?`RDcsW%Gu!d@BG(*UA8#z%C&!$X4N?!5!HZ4z1xd_zrf0BXeXE@Y1+luuf z>XP*Jtk&<-vQ(2Xpm3AqDI_&M?U4L0-2%{-R-dTm1Oo4xlzG2m)QKF1syk)>*8Lza z?@+n$1UfQCCalCAzs#qIX4uSESSHoa0X|+vK4w?$)p+Olf~?%<-_T`dlP@x4VQLAp zs@rSk9DY5-Tu3ml4&Gk*A3h~CDVd&B;M0ip!eKwgYIQ3^ioWnJFkEk-X7}eWL!@OE zzy(cgJmaNz73P4YF-9QdMJy!pas$@%2m@;^D06X+FjseW)^E`gd4Xn}#Ri>=Ee=G% z>g`E7ew!Q+DMo%8dewZ9XD36FvCRP3A*vJTJ>2%XFDKda3GDq977ggIN>n<27)5n* z6Qa0hG}C~XSw*0e4S1r+6%(Umab=1l*wlx+QBM{a_@!7kDQ%MuIk7_$FOBW;Y_T=FR z+-y~-KRGLr?1D9y$0nMXF|)R+*5Qk4Hrh8%+s@VZfwJmuW|Ofm{(%L7V38$or|>c7RrfpZJ`a@;wqXafRoHYUE{5 zpbA+5cK-?~#AHvzEE=6L!Ezl;N>0|gM@Z4s6h=m>tXS}>4%I3A_r&BQP*?&E*<1D! zW-jJ9)EF8f!12>Wd%H>O4^cfT@c`LT5wuN0n24oOjsPrNOD|YIsx|>oG5-ohx=#{w z4*tqp-$M99Y3LWfAL1Jp2w;RbpR{s2xw*v3=@dT-E734QWupl~ciyz64v?F9H5T_Q zVR`RNRE*LmWuQ3TPW(H-T4we(EM4j1Kb@D1dJ%O%lTfpxKkJ9kj7A`OASP`3R^sRW z7k|#*_YwD>sySJ}Y}(+r0yiXW7vsBei;9}O^O{=j`ivDj0mh!F)2o0_{#?W|!5AY+ z;o_!s`g4R(weD4=z{|Q7y~Nn@@O^i8s`_rkoma5t;k;Y!?o~XQ|9t8bRhFtOb*1!cvhEY{qoT!bIOveWJvRXs zW-ZNZ(LQqR+#&}#oJ}7K3|fMw17>ym&-Z@?QY2AAg=sN8@byr-37Ju_FKo*P=Twt< z<2hhZ-C=kplwQ5FK$hge=c8a;Xi!eYx~lLPwCzQXy%kH*^!bwyO%(K5_EN&vUTKV2 z>zxCQ@9?Lj)&+V6t;-N<3&+b^9{mu6#vpEl&}_9;3OC!%o%umN9+I|Iv7iu;yEtCV zx?71$ug07$*C%oj`3X1@6WP(dqjK?fe?HeA?Se|Ct1i6)y$96;J{A&JcW9-4oP16? zke^a4*Mmb5$4fGS=0Q^}wAXVC-S?ck36 zCc1pP+VS?!4343X6yn8&i}47kLgmDFIQ~voM74mR5W#;H7mWCv7xjiKUy3nQmA5H* zEFP~Tn(@IBQ+h*@jHG3?yC&GKC!x0-OdQb|nf8|TM#0)eXC%`R&-T)d{RrWq5&^w{ z3z!J!i`Dm#|9h9b<-pD~TVwo}&XtptP`A4VI*-W|zG`5etiRPD-KO0Y%>?kS+#1_= zw$!YuTk@~2sZW*4Toi;{Ic64ZPo`~?lDT87v0l)X5l13@2?XC4_QW$zxlr<)itIO4 zSS^S}o<%fc(l4cymP>PZ?ol(bP7G0s7syrZ=@nh|S|TsGsDNxD_e6uP&XR=xR~+2< zJ6>$joD+uSl&TkZ)Nuvt`*U}s$8u|G7+|3-NncKFE*=74q~e8Mf9DCkz?u$JDhu5V zfkDmRVLlNgf`R{4j!o8GBI}vRJ7!9j`}7bj5qX3Bf6AKtkbOOCqw$rm-ZzE8$;^eYs!kw3h`1#3uZH|`v2yCronaDT}t{EtBQF}x)Ia0 zmpy`{s_#O9T#?1|G*(j08Ob0S&;3nI)EHgfrSE95Ub(RKvs-6tC=9dOB{AWJ8Ef_m zG>1oyGT2K-jUVkF?<`{4A8||Kq7P)d8czQrrh*7OQA`ojsXcK~^2;~6&;Fg3adH$7 zNLL}_aLSnH2pIT6C%DMa;kS*wN^dt-mBg`_@-?P`l;IgBpiEJTbAGxx&<<*4&aCp3s)2!M`vCtuqIZ6-VB3bbPTX1+;Wrq7yzW{q`yWXKE~tyjT(A z`*9Rq0QoX|y|KWc*reE@NLJ@wujJQgrtFd+cF&;U%-!fI0ae}lQfLZj%8 z<|c9)W*mTKM03Re6B=-9GR?q@=t^?E)eU>*G{m9`q)HqP6m!?$It8SOunF|$-0aQP zHuI?|$3aiTv~cxh$s%+w(3;Z(_@@IeL@>x1?Hcn|=!f>6amqLOZ@G_ZZqt4sk0io; zb&c9a)yYigTdrqCUFbHd5YT!)N~_zq{{A!Rf5k1~@}4bCIfH|y5h;V)6Cd$Oq+(>N zvm!C@G%M5$?C2&>;m?t~SfgDiVAC=9@i)ypYzq@PwN=Q0Ev95Y#Wu2wWH(e4WKNj@ zc)kiZk#*leKh~b2r>-62EFwHOG_&-DY^wo4=h+FYHjn)T@w?8X*NtRaY|JHw=Fc z*xf}F(asavM*#Q_*LT{VRuZYrx36pQMy>1@NCZz~kf=BN#0U*kW--cD=jM|a{2^&j z5u1|KpVsItr9gk1^&Gi&3@_yuhl^5s({=N2z|jgEL0|d6cr2}kFYp*`iHa79F1Yhz=*CnTg`E$qaXfeUEaXgkMSK{q^P;C}H*h4-vfSFV)1Ed+Hi!JzJby@= zkVqsKhJ6P9t2XRsD=<60ftj4ZuBnahEnQRBwQl7l0g3hn2~|{S^tM-b3O*A4)*pYG zeDD~Hs=BqnSCs=F_9v#9W+WfwLLGz^nopFUP>m8$;PaKFqhtLg}x- zydi$Sl9STh7fmo z;V|T+U+^Mmhvf}LSyLuJGpcWf6iqt3OFxqN*V`Sa5EZEnQqGkZ{vA0m?CHPbdRT^J zDi8Pad^K;6Wr8>m%N(E-WE~P*dcNJ4D$TUHKOX}k6k(s+K|6+^G??$S+5VW6?D2|Xi z!Eus^^1$6h8p__pAQ)cg8DcRWMhDkby+Xo*fwES;qD4Z)fYMr<8j~5C+4qeCoI)E} z65-KQWRU-1O-I+`mPnEfO%ieGbE9x258|HsOzaYs(gUp-UFHhPRyT-0ML)s9b#@YU z5$ZX=vRg%b=_-=Tr^zy-9B1oH7A@;`#UIfFq)^Go#Y%xT7@V7=qS1u}(u`9%WV;VQ+N1<6-^C0VUIs zOLPhAMMBQBf&CNHMnBwb=Iyjo6ex#bjp4E2O-m&=2~uB=?OSJgBwKuno=J>Wy?=xA zXvRtSf;FZTf}Oec@#leefb+*$Ms?L~CMOcdzA01ag2%89@x9P@ZwZMhj--75Una;FYgwo`bAN^X zO|*Pc9LiE|tQYHUFKw|8u9V8`x(g7PHl}N)f*4OJmzBp-bf2>Y_t32&cyJ565`ylt zCjsuI==4`D5Nt&`S6hF`p1eSuW8dd#yAVd)6{jEKM}y_%i6NWtr**xJypbkKbW(4$M)KUtp@^V7rxo75&Y+B!4gMYenOj+6JvO`2Xf%&M1l0;P>2e&rcd_ z8B8O-L{*>!DJnjZiWl+!(k`!`!)xwUC=K{kX2iP6yA@>O1fSwDld}Y30i2*p{K5f2 zAsCP*2Y!7mC?7;EU(7R0$BIL1dXa2JU7tJ=QB3C+==&@s!h`uNu|dy^r%b<~%3oiZ!jj?)MW}g{tFubvdXHG0kdZfg zndu~+|Kyd-rZ;m1KG6* zKE%HZ+(b?@gqUBfJ!*EIEGfv_abkhAPHV}t);}gxomizPGiZMUpaTp zDE$_U>;{NJkf>p1byPQwS?0A@LZ))zXcO8OSrJ zmQHGsg-V21-(iEu^I++z!Y}lgXVPkQMu$UU=m6PVNe7GA4i zSv?dp`Q~gy!{GJ{0-zKtwF`OYKh@Wd6k(c6+B>TU#Rn%NXs&aKAqQO z@TO|s7*P?ZyPHrCG-mmju9nNU;D2cPY!1{qFC|sgw`ybh3;FR)go>P4Qn6)oL?dOR zYsOZ0Gp9hK$^cO2dk?%#lYWPnTY2DNlH##$&K~_&8f`VW9dc0n3^{tKJDz zg{|-wLRXJG_v<%QpI%HkxKx*@2pOt0(Q)_^-n!}bd}R}lfbqiM*G&$*(MH+9xJJS$ z!SG-z1%8I6AqV*wgcZiFkRCUUPdRm)0jDz6xBm1BBYuP->^Ql<@|nha3|GJr!ajU< zTsABFRXEc6?f^GNQXlnXrf)V7XxCt5T$x7Kf_clY61SReIaZyVAooMVnAW}Z%Gky! zHE&2y%EJ(56+{>ZcPQOEwqnVnC;9o|=C@~lYfcoo>;A5-+K;eND9Gx7ES_;X^}yhA zb))Z*K816F23J(Vt;Jm-z%XK9h1?c1u)+%+L~eYT;J(dqbh++`Ac)~LAJ1OIUzA2~ zf3Ek$kHRDeR0<0=Qy?}Cpky&FkHBRW4TsI6;}dbf2kkLRX}%PMh}j!!Kp$q5(6rTe z(pVvDJ}7Cy;%OH_AlO^NoCcXndKvTKOV^qjgg|+8d`aH`Lp9;7I*{N?FI%xU9zkLR zy^~Y$6;CAGW822-VbL(BJE#Ra&T?pbo zv>H`(uycV<__Nj3UP{Z;gtaIn3F9Z}sw@IWv8XM3n^}(^>>@3na-Z!~lE-}>Jk^-M zcCI2NMUw*JnBq`cQK-BJE1=i-#2MGQL@Uck4-ekZpo1AAvpQLTvC&1PjIg5LsfwJd zl`^NF9yW$)2Xtwd=HMoXI_Ei|w&C`Ns@f3_hN2}z2#W7Uu7#Cx#m7Ksk@kSCX^}Nc z8~ux|5}7hajTRapn}L$|HS|#Fc*t$)FJ0VXa*dWu3kVZ?oqIrNL!h<<8_(_WqGOxG zavXh05(f|k7U7zj+MU|r!jT60dCIFiT@_)WVl5@4HJ(CKkW>Y8G&x#7N0hRvv%{AmOIbcn)t%zCRR7w1dIzwo_GWUA z`LxlmXx(4eO=K{2>8H%9$m6~T?uoWI;e)~G#nZ@D!(XXw-QkzUYrZ#33u$q(QLSMm!t!<^v-;=ny{+L9UQ_yd|l1=QX(0%jlK#xd{> z4ISloM{2$DMRX5N%dEfs(QoaFmF*hV%--5bM3<~fKbG;gkU~Z&T{q}NA8L0K^S9Iy z5}G7#pu=q$@ANqQjG#D0Q>hqA-ZdzdlH}ey1K?)fyq0fAImS|x&n9N#0((g!+MlO0 zKaq(rKX)L+8-s-M3GNY`1JxWYQ!eJKi)mevEd%430?Id0XcpeC>RyfF1M9o}yl9k0 zV;|C>7KhC`bKlYD>K|gG1mFM4#=f3bOn$TnAWEYT45y)tu1lJVUl21K7^b7tUsW-u zCgb$50ps)4yF8gkgCKr7z&#q}vs-0vLcqEMJy75cRMtc@Z zMi3u!?NTA$!^`%l$p+Wdd7 zA5gj9K?ucgo41t5p9wt2VwQwAB1>--mwRuttxZfXu1ca1syqpM~bfFGh(>0&2M8pT{V% zv!5OGsZk1hQ%$y}l!00_xMm3sj!&%X5P_do~@2(_<7D8e$^MR_M!7n*U&P=>@g?t*5% zOF^i=Kf>Y39yiO3bS<1`FKc0$^P-==6&?vr1BcdY!;svE5EF3~lE%d9ZxtsfJipCc z8>TP+o2?L@)5K35Qq|tG9@`5)nHc_16@`+=^4riO9i+ZW!muB`6$j%ME(CAK9_@&4 zM#SMc<_UT%`u8%tvYH}hcKdqma&|<#q=%J%LX1zkuKQVcz-Z!UDtk|V^=IT6s&n3Y3>6Abu}j)I99Lt%O6(}#iGlzu+_Oxe6^++d~(e#L7WpLbT)!y*Oi8QugSpa zEPCA9+)T(F^$cr_sCVd)^BG371f|;pUx^e^*#8rx@ZRVMLT{G{(1uE? zY3b48|7HFakaQ!q6|wKkN#egM5Ng#+o76=}{p$UzgXtd51bg}&dmdeS`n?OlGORo! zicT>sw_dfGd=dkxHOvNs+1T6>(8f}fwP6Bvtcd6#d5)rvEB~k9h34cdY!PE;yVC{p zgzo?h0B~KTS8+4ub(O%{M{L!!RyI8IK9G%~gyx!PKH~-$tpw@yLYTXVjL3Xk%BA%Y z+P`!4;0&nCXR>49oE?JpE%F_dQG$oxCZ^>{4guYTqfb_OoN!i$83d38O~2|WY_KsL z1OH~Mk9y9c0kUiAz9?_fKpi>%e>MT_ehkUW68IHg=^VRA6MtO*UU{%WkiVZ#==tX> zJ@|wbd8Rzpn*E(Saw`rc4V`w*nq~Z`=G0sAY4^R{mtmzQvpx&6Z=a6b6p^_$MHSqv zAn2CV+C4|!OP7#h?dLgSPhsc&Fy%GoSQ8oz`QQ+qC_)sTOI!vlwn0$ojMkP)8+i+L zzs@NhxAzdecmY9?)a+Bnd~k3}N=7!AR%%!XNwM7>rY^wgmCb`Y5a0>GMz^!R*H5fX zh0e-@wv(k*T?+Kp#$Rn}^5WWCzO@R?Jii0hev*JB7}acswHxzu74u!TFbApl#d@Im zei8&?W2#1;K>{4i7SoiCg2%P`QR!cXl=bthtV}f92He?Q#IM+F=j74m=WZKYZ8p*G zcl06?9Oy~wI`}*-Vp<5Bh7Y}<+SK%6ik4QWc0`Iw+pgKn^T@I}L5Zs&vu&QN6|hX#*_WL4x=pIg~kd*4KiOfXAH3Q|lR! zNz^&Usz*JX-y*c0St`~uo0l2AfNAV$s`4l?Kb_75Z@21~u)OVapD}Bi>d);I5#!_) zw>uv0;5yLIYsAUs&1BsW*Z6jw47+>r96syE3R zhxSs#P~mI9S@GtV2Imf6*#h8^{OM3xt_^YX4cF5k}0+lNXhxBv{;nB%>qXH(Ji2^qOvIQ#Tho8g@0vTl7U=sYsXVB% z%6LdK1=XK2y7+h3=d-dL6nFKkRE`0TEj;em2>RHIBO_r3$!-IuRM}BnA9@T{3A|>Qf|y`PZr-(8SBycbF}?8 zUv=Ws8+gwiodG0v9*v|^AfvRbqo=4HsSo4 z&hJ}2J4_oszoxmGM``<8e$_GQ=XAE6>bhR*-RQuoyJnbe78P5zYm;55`_hS=f)Fr5 zdx8P43Uw@}d7Iic82Vv5AjXwo^x*kC1sa%Ar8)COz&d{G<9M+&aRrTXHfz=4_SB%l zVlIH^)5RD(R1wK~Lz-K-a_qFn=6nnO?WqkykrSNYx*+_Ww(bJKza7Ks(`FdohWGj*2do^j5jl>g`rbQlqK|m{_v<~tyHwGIi|?xPRS@H? zB6rV4r(A2aHwlR<(R~Snd#k8m5h*PVa&&8)naUdybIw+{L%-dGe;e(Q6q%g21CSjq zOVd!!M1kCB2=35rDWi#O4Y4w)C3|M?_1u5+B}ZL;6`B>I(N=Z0PURi(|BI7fXtGYM z{*!Z^nn=_hh`3&j_4{IEiUcKMfKF_0I8{`5R{e$6NzBo5643NOaZGfPxglz)QlEg9 zj(j{4k{7W2eTkCYGXzjYVh;0 zg5z*4)Wr4PmSRe{=v;%hMdL%n;niS?UO*m9Lbm@oe(E#~c;LV)^9MTssAyrj zl=XFSs5_GU1hB3J8?gs^MTDg-ZxWg3*&x@{E3eVLbx-lcr-tqZM>xDjrBmz3ZUAwh z>fsd2J#`UW#>&L^6(4}l^JI_VrW~A4KG`98w8*l4N)}Vma!g0!k17DfXIE)rRtvwv z4(PbRf%r3*5+QoJGe5MMPr(umytNJjH=1oBiluR(@y|faN5Wxrt(_jbja+NC=j0^c zDiRvt_4A5NM)|Ch-HN3k={d&4W=pZ_u)Vr<%u-{%5-bVZF!`k6WqzpT+!+X>VoN}$ zu);TC+RNbz*3;n2w@2D16iwSf{P1&pE>(kiuT$$dWpxJ{mvrnUtLH0_Uf8L19iqo1 z#`y0P^4EUmY241wI8ek?@WzkU*;zIbn z;g$q>5_Q2Wr8~K z*RXd=|FRy!9Nc&V#RG*N+91$( z8Z3{Jt@S%_qgex<2>at?gUO@6Te2h`$!&_O*J%X_U(LDkd7lVt#t(XHQ%xqXIvbqO zQ+MQDJThY-H`tSQZAzRwAA z$^tIQHoF}1DYZg2IA62kjr6ST>DrEJHzy8>rhQy(E%a* zNg>3qprO-3^kyQ!!zZI@$Sk$dFTA>GsOnFcYp!UUSX_LFpvd6?j7$n~BrreO0Yxq?qpG|qm0qyDwyZXbr6AY4b<$(6m1lISpyW8pCZ z?M@A;aMzqk4aaag$4HZFMG|oiuJ!8&T1RFfqP6)!+drE z^Mg6!)lZ$ow`Qi~iFm|&bh$RT7>$pvMx-%x(`5X*Mq_?n)sV1Xu$(UL#&4e@)GB0lF67g5c|2B2l{ksjxKjM%% zofz(M;hZvl;}_ty=ajH2{3S44cyUNmt|3**3mrz3<)!6in2SBo{2j^Rb_`o^69pnI z)lBJ2g2P#^&(ke%yVJ zUpN%jgP^O42O`v{5lThG+=I~*AOxE|730YQzOue&@~gBn4+6S;-(Db6F8DL8wl@8} zo}M_Es61=x&nOTjLX!e2afLhJF#AjP`%nTWZOEgR#oA!m-# zl-xw$n{xFBuZU~6OT^2j)IlYhTkC1SPTSSSDmg}6%8`(cEZ!HlAw5v6;$w1zK&*SV ziLg^TpJYOxb|~?f1b9nTpSWEh8Ielbk@?6v82D-LokMQpaPw0 zoeI9OJe6`C<`sP)8@7GxVehDTS${T8tO@jJcKgjxE;(RCk0)M*;v2GR$~TMkkolX5 zNPqMZ37w4ScURe!$_OcCref`{u6=rE&2-dFHLC#7Z^WD&W9$V>O3DWW&h9+~zqAvaM2#@=jUq;Gu%=p2hicbD|Dge;a?|H1-R$N zAVTHr(*>$HMmRhYGrz(0wdH}X0D_ml4rnF}M5ipCV>Q#NhhR|c1AhA5Hx+u zRynBT{4GzjCwm2$G&m-rzQxpk~*KVZ}pRuTGg#KWW*C;@Dv z_@yS)I}N$XO4kb(%kFsSte4Io4j@o4{uH+!lr^$^w>I8KJGk%wo zPt?ut$Ae$A19>A7t9hJ{R#h^OA=>S%@J?z~9+iTcnaxZp_5=6An^7!s%OMfYA3JQ7 zH-Scmn(%JZ{#q&% z3feTAv?+_lbTZ_M;|fqdC;HkRmhSL^sOV1|NBC)U2_6pB=jEf5W5tk4(GCY-cygzzt6YBK}_31p6&}N zTMW?}CPfgVErSHo$@bzR6H&6_WnR$?PmjZHyz>~_$EGG=w`M%G?apB3f>u|t zDEd#c7{3*u@M9rbx`(V2m)44j`OA+k7cD~ub`;M}-za=cGS{Mb<9eX0IFJgs;jP-N z+BhzA_iPJTqY9eErPA}WI688mrOtVg96z6^ondM?x>)os+bI!ktgvrQ!3+G)?+^$Q z*G@s4bfn+iO&`$jZZuCD$5s7}Hp!dK;?aI8A(C?I_}3#mv%C&WnU<{8lrIxu0v+Hh zRrD15%zi`u0h>4P$7zRL4zSo2p5i4E_D)8y_zf2sxKT8VR=BzRFLYWsL$Yn_U5e~8c4j|($Hyvt@*HeQ!e)vu`5TI< z%h9@M?<%#BG7c^f7TOlFMT!%y2gce9;vk?c;XF8+&49KqCBzVFy=S*9w_i^}{mD|Z zK{z{QuDOK{FncJ`N2efuh|TbDd|h88AJtBiuc1u3HW1 z#na0mxpgh$rmG##iLo3I_GCi|jhSQX;Uf<=s}p?)|9L4gAIlST>#s4pFb^IF2-WX1 zRcx}3)mIR<4J&jHwZ~C{5iSslt%HS;edaG%)=d<3-;61Xisw7Y>JwrtKGz@q%BBiM zLqox9wprJ~{XWh}%^q{qjVl%i!&n!)JZ++aKcTIlnn!c##HSJTbuj7MrF?Z6DtL{6 z-(mKu`3q!;IvkRx03b3i9+N_%6=KiDQ~=+DiSKne&`4)2g>1$dq{*?T1F${Z9L~>( zCHi*qgqzL5^?!Q^O>X&0_x48izR{s+$iU+4g*SMds;$PH6I^56AP9-?e@d|Z4$&gT ze$n4=kRgAu>bP%Wf*gAN?(|*(AGdbYPAl~CZ|Tr><$GO!;+6$j~Oo)EHY@5O4=^G%vCXmVh8F+ zJU7U997GIwqo}%o2X|-wh>Zt+|6@&a2lM=@Ff@@PcY%MI)!wkbN#}HAb?D@Nuvp3F29AKbT6_Khr(R;eF34EHsCa{7VCwC?q38u^ZQe8K z=7tDL#_n!wP%_8{CiP0EOWd*RYgSu(`WbN&ldwiBTbyoo=s`PEN)JIFc^T>v6=EhMeSUD<}z`hg0L(M`hz?t2~Kd?coeM*l2o*Y5vQnV+^n-lebWX??^60{hAa zF-vF1*53G)P4)o=s3X)>d&#fuB2@%*ZHafE5ZJ*CUMKByQ6(m zd8!tH`mSh6Da#ov*)Numi|RozWOJ>@J!pXUh8Vcp84a0SP$8qdA>?)EtPr*->B!*e zuk@_*c5_kz|A-GJIy{IFe}=777C8v0XPJt_Djl^&UL=EonIoM*#)Abaq6AB*Yqn^S10g^e?JhqLHOA+1Mlura1K4Aw{MbWO z@-0E@nlX7BiwgeOOzZFSv!PL2>Bt$wb$N@OEwpEjOkT)cz^2kpzZ}YZfB=^3`wCA8 zcB5K3a7Adl9ns7piXI01`VkN7kG6Q~f)T5rg2a=Wy29NHa8w@k>o*f;I>U!w)^FoDM*D}isJ zBY`JS!8@ITF-oWVQ^~ycb^J-JrRix@Wk~U+2MniUtAE%z77n=#Wf^JSd9!J0M&vtx zpwib&G)orkPiT>y?IJ8BDLwD4#H7ypboZuMAw>JyY5Yt zKg`1$-to%JNYjW(v%YDrM#aP8^tYM_!mRVa!8%sM2syUY&P>uq4mX6;kUSx2HbOIL zloinL+h@2-e`zxy9*=NxA(&xU+B*BbCQN-mZp~qE_Bc_<0X*edkeJ$u7)3W~@-{9t z(Zgs%Eo%-O%9%s5VKoau=|Amzcy*cJ&-7AzX*;7b(U8cpw#a#F=xM&MpRjQW7;??k0u^a;u z46`Q+H$v#z$J7ZIl|D#^(6ZlLeR#Gyvq=?h@{{LilGc6qp`Jm^fF}&H@ANH;OKfvl z9+@HRkR(S|qEaNRJ)M2!jX$c~ez0G1rhG*=9f{T)SmBloQTL-2T`;M6@m&820k5zY zH?p1{hoB@vI42F|b#6}5rx#KV4q;`$g2JuLCv#+MIWB&Pl|*W&663*Auwo4GadM89 zV$V&!VZAsHR2l=-if>2P?oE9kpC}*val2s4lq_98vOXwaxSt4+L`W~E0HqFgJl~!= zI}KrWVGukPs;820DO|Uo&pwPJrVUX2@v`+Tr*}w0j+kq7>}bdT`=<;@*&u>(t?8F; ze$FK3_I*nbyjUBODju0r>yW-~@~ ztx&UMWK$oUZiI;eieR|^MlzTL`Dew$2sfNj+?j<~#41QyZ?4AY-3NRza|hC*0|}#> zoI&jTH9*H}6csGra`*7hV8F5@pblL*;{0gSvR(|mSO)Yo*%MjzyEfmpar)!zx-el} z^PP-Zf%>$LEXog}s2rJklapev5CWSXTGd%z5$*PM2+o|7!i01+WfPn=j3HmeK|(^B z>q4^Dg>jt+GT?gOj@M?q)-Rf#ETw1^taPGZsP1YY+U-H@Y_A?M3)ok>Qt}4XSx1a7 z7Ml3OPKAt?6ffDCy|36~m5wEku}&Tcr$&y}E`EU8fDx9ipig$SPvzSAfwE-hTb*Cg zk3p&^0l)J*gn9tPr++UyUC^}#?J9nfhGL)Tu$7^zGnU)T05LItyCq!g`xD!iRu<`j zhSa;{@B&pKYN;I8g3d^_X7focW{Gq0s8igZ@3Vh;5PvS{`D`*Cddd9k$8Q|F+o^iDsgJK zRo(>X=^~HaU&?(|S8`feb+?<~WxNiHb8HKtd*?RDiNnlZtP4H*x}C2cr>4sXn*F`2 zW4?T1jXfq#cw)&BAd=Lz>gEpRmD5L#eM%8i_IhodSG7RCxIuLXkFuc$cNpH4$wbOPR5kNNxCVLJ9)!E*H`t^h|>$ ztlgLFDexX(C!pGFPtc0hS;3j;y_V~iQnzYihEmk#OtA*$cqY)R#;2csZ(T&*BDM)g zvwVrUjhf;h-1utzL+x}bP>4wi+~&YrV%t5xD%LyZGprLX`>cJJ$S#GBKKVDi)V0_F zV_T`%iIEGxM^OB=GfPh_Ly;z_bWOmZd5}(U_e#~29wbQImVhQe16t6_$}BWc%G=K+LH=Gp-_L6t~`gY>JM8A`@yxgc}Re)P$;BdbBH~ zvbM&=folLB2lyGgG&T8dA!~^4?RAV{dRXVr2`}d-5O@lhUF+m z=}*r)2ku_8_*kz|wLDiZ`ObmVe+=jQj1wDH^Ng;yHNVd(i{s9+b>O zl_)F=VyH>4XIi&=iGhlxMKmz)|4R3URNmKdtEqqgWvSdtQR|w72{1kFuV~p-02FV) z5GEF#pr!4b5gn}@f&Px~jP(#*f6gCQL!l_aBqj&6B<_?y$^{;(YgXC8Vf+%MY`vUO zHgk0+2XGKK#<(KUlgK%y*$0UnhpEFTot|G9{#-FPZ8nQ+?HY;VOf}Ns8dm#Bjw0Pd zLKmXTSzrGypNu(l3|FlG>T=sAX$O5W&dGW!>W9<(N=|K!s2~6 zyhpaX06eqAnriSwemYW6&vYyq$Qs);>euYGgDex>xfArDgZt(_Te+A(I65XSc zLze{NZFZgnVNs->xeQ%TukQRIUl;;I$CEN~9u@qGsGU`w0cPEuR5e>tsAKERgVWh} zFA66z(e(-Pk8(HN zZ90GI;{Fz2E@(`*keZIDGdA~ZiIE%8i6Qj~l!e9XhX@U=gA(;lUsbkSHn|)NiMhe! zoQ{sIXsf=b3p@k7Ok{kli!qrP*is?2I4Zb{ZdACwz{!Rh7v1Osd>I>&kQg0S<8s8y zSVH5)tqo!`pHIL7NSe~?_gX{E#x#=mYoj>>dZnR$1U;vZ#@E4Rw+MZO-d*IjU5s7E z{7k6>!h>ngJ~Kr#0e;np^0zqlhdIj*#!k!MSyJy#xZP zYvR?K;n07JL-u_jUEaiU#7DvXTt&ESvh3a4*-JY5)U}qELHd6(pkP#G!r9_<-*^1% zHvTp)%VN#5Tc45I$o1yKD;d6k`uD!Vp*@gUL&JCIfZRMbeTV0FI(k$8b_7mSw!e+> zCK!mGuL{EW`$pW#24_fio}os52-$35G3q`^jWvp4_m`eER(-7bJL6{g z3~i(`@dNHZ;+*jKNlGzQCrExHnxsAk4c$b;E(=DsJ0|hG%J&G0En}^;2S{M7?+tl7 z&d34UrI_4MLN{&rW{N_md@fVwxFk>ZMwyFM-bH$uaZBm4BBo38#gSBgGjX{VA}L3> zvCZL63@X)!LwS{86{>J?`0QHk&R%vTxl#|zhNLEWp00s)_2{>Rsi3 z;rxiU?NY=rv<>d>P2ywpE2gzc^eeumd3>eZ`Wr+26JK-9Srz8)<3l`cSMqk=Hver^ zoYxQ$78?$Y&tW#zHtG_tJA*KFTJ$9%ckIha82=DHp;Cq5kxt;-nz zf7I*fMt-BrxV>4DN0oA66xgm1c#rnKRc0f=5E!EXKovmb~>t4@dNfmjOqI|zi~#|!8{U{iPj!; zQ1~}3VBPC-iga|LopC0jMfQ9Z4EYZBf!9288^D913s+dkJ>^^y$HU;Glx=xYvXi(= zRQ}*Ss%yd3x8wUIeBw2URmM!iK-`Y(r=!&0QRwfBVt}t1dnomi70Z}~b&c;BQ90a@ z2E^TVu8p~{yB=@!%-!9PrUF>TGZ_R{abz2mM^cOs?>M?BRKMZ~AGB#LW;1YB^<0CX zL3#*B^MU$&hgYZjG?4u}xx9~7e9nJ1sj@80`b!9}0NH(MLf(K4Wa7Sc&vt}5t?7^< z_)we!u@cQLPTqjHA{4CRg$VhLF0N0~tYy}jEi$W+$Nufm8}Dd{J(mdHEI#|=Z&Vxi z<$KVDXs!eRFnue9UZ`|_RK=PAz}pZwz}BOGJ)!NUynoivzs~n4AvCfLXOC<;I`Fs2 zlgCokEfrKnp%m)&?oo0tvAI4PiWOJZ^N;7hpyW#4FYSgML2qggnfY4wI9p}V3<4Qk z1tWO-|Dzna^wl+`HjI$IpeC8#G>A!?B8}OXCThE}x`RmTusB!S+l%J-{t~ak^3r?6 zF7Zh-4|3C_ip4iYw`mZK4zQuy8s1MlAv@b z=;U$HO-s>!jEE)zkeQQfq&Mfl4t;2L-KlF5QYK`hg^gLneWw;u1MpQ;GE?U)mj}ad zI1>Z)Yq z^(c{=aUf-YXiBX5aP>P#e6(V(OHXTkEs{jzuPFkSc9}x92al&e0!#jb&Wc; z#)q;z@h1Y!z+&v(b{y@L-E2NZ;>aWa6lF|Z)0(TwpG5dKEnwa2ambikQR%T(^6<_Q0L_-fh04MAYe-UYn#Z7ZDk>(?07@r1d8QA&}b3tZygcqM`xN3#ue0ngv>uLn7Umw)lz-Ux7r zz4HOIbtP&)MF+3C5j-u>B}xoHeZQf9rVKWdYowVG{mTXNyd zh_!wpDat>?%Yqqx=hNBSu-Bo%2SM6s4woA*wam<`2koRQ)1Ro?HZmj?s;D z;~^Xs2DQIR#_Fv_^3mI26{o*eoJ!1VX^smK_JjFP5=Yx$azls3w)7o;Uk*gKO16{f zJrf_Ojj8YhKF-tB_`GmcuMvl!qD#*UiTp{ zQeVpwO!?(RX9Hi$nkG#qk)zrYeHo}>)inTng1{aG)M$ty!!Tw*v6%bw5i1cvg}&om zo2@U}*Rg!OggTJm>Swd*8Hr3i*ujLW4%j@1XNtJrcrAL3cAYQ@xj&~918f&hd4`lY z3_I-C#CT=I!n3SqCQ`naUvSyx2&^<%A@~B~o6^IGxhiaQiC*KWb5*Vxl9ECHfTvmv z3A8COUX=l>2~_rN#qgddripXAQM5{WaHB|n7=s`X(+~x?9eTf@sC%wph<`1+7WgZ zYqDV|ImLmXX62Jna)8IOx5yjQC|Nto@EKx<2W+iP7@RdM6m;t~&`xzlS@;Gjy?nuj zmNmD#n4$+>>b2u85kU1mYyDv{DU_pfXiB@x#u6vg0#_DTJmGKQI%g$@J zs=|j`LW*nmUB&ZFGkDRXfm%!iF@Rb%Z&?Os3i6tRZqL;4G&fm7GpJ?N4*DDthIIz4 zAgrU&q!0vN`Q#HKyiK~lw*j*h1nSVslD5k9AH#b}lEQ|**2f_qFS7TLk^!mpjtvD8qKxKukomou_G5V9 zdTpnon!^&cQWnSvlgj2|GT=@?!!*6FOazT3F!j_PM%gFeK9m_1;hTE3pPIn16aTP_ z;)o=I&TDEX`^nTbxZ7t-h~O@#Eu||D;2}4j5x22BdC4(dQtPk<%I7yv$2$p2Rtu=n zZZVYlJX7nZ25E(8AL)7Gs~*~Sc{`?h^pJaRL_}a$%c;>zJ*hz8`yT$bSIhkhP!|BR zDMyIdb<)(wcw}Qql#nTWp1%P%gFgn;3iINYYkAQ6ll&6VUeNIx*Ezt0htB-oDyqu$ zB^asyQ5S&Ib_4KAY(<{Zr;H9NvG}1Cnuv4Fp66`&M0`-es=bC1E+fuVAO5UEnqS>Z zY=T>U*_564&15Wj&7OUPfH4Hx{PJWc=(C27=zNA7^QtsgcE&4 zrE#7@_{5L6v~7I6KKhLkWUuOO4%mgVkAomlL+I8W;gh(;zFQ4=S*OlVHV8X_-(5DH zY73h_I^-&#@6~G>p<@)iN>funeT0wEncSjFGWa$)m}kAVoV@nmooJ`VrcOl&t9bwk4tNq;ttz@EAjxYrhw` zY0FDKGgz!cbMS@bG^w1U{-a<*0~fXOD+~Sgwdz*;G^K7kxaQsNPi#NmdT}z9cS!n2 zbXAnPlD(des8H`uyxgH_Ap&YNIs;(eXQbf18e8V)-~OYsFdDxR?mC&ntm^a=fhdtl z-e%ur5sA_yqP~chRmG^ z=WWZ4x%wt6ccYR7uWQN1}|?@x`NE`Z9EZ{MVlIpD`_G2 z&t@law}!6&-f=9d3ijmLbt?eCX#wP2%)i*%nwV=;>0PkP$J@i zZlWn~n`$~PjQVBBRH!d$+s4mrs&+}3PIH2N%SrEP#>PT=kxYHB&uGDzP2|05;U@f_ zZi*by>R7*Tn%nLxj6AG6eK7=riHFG)FsCpqZNB7aB0hJun{dT9PLIg(W}3$*hV7&6s#NaV-XqCOmw9H2F-*(^p`Bfkp^4Papl5zG{Zl#DtgpzL!c~ zJbD2Qdv(=OQkgxBMK@1F*d$+jeJfDn#?ls;+?R8O=R!CYa2&PpzHZDr>a5h)V*;5V z$QsORz&-MEZjo?%p?QCWB!0%7qr>F7^f0MPEcv3sFNBr@`AuUraS+=aX^G z6qz*4b)rgDvr2s^e#u=6PKxmFxnut<6ESkT~up16yt71l0(r7_8wP%#3vu#xJ9jZagnJ4ia z$d%moxSjgrxYqhtI0-83s{dLhta1nBTX9;f(E$XD9RLykKsRl;l_2u|u;~TMCBp~MTlm(h tB|BvhxBx=82@eJ}klO$Oh?E2DlJEfl005W>SuzwCJ1_$P00004Sz0RH&ieoW literal 0 HcmV?d00001 diff --git a/qa/archives/pcp-numastat-8-node.index.xz b/qa/archives/pcp-numastat-8-node.index.xz new file mode 100644 index 0000000000000000000000000000000000000000..010c5310e1204f50be0f88ace6707cd76e25c115 GIT binary patch literal 240 zcmVt=J3f9ai2}qDD7(;Fj zKyfB-jr|b0q33S#miz=Hl3P^7mDL#eEmLIofSGQ qN*)}{AOHZ;LLL)e5s6^{0m}i12><{=wkD#n#Ao{g000001X)_PRbo8= literal 0 HcmV?d00001 diff --git a/qa/archives/pcp-numastat-8-node.meta.xz b/qa/archives/pcp-numastat-8-node.meta.xz new file mode 100644 index 0000000000000000000000000000000000000000..62b4f32344fe22dde4c3665c12833971d3e0a662 GIT binary patch literal 33064 zcmV(zK<2;wH+ooF000E$*0e?f03iVu0001VFXf}t=J3f9ai2}qDD7(;Fj zKyfB-jr|b0q33S%HJZxhLa*PmospcO`r7#lIJs>4YE#K#He#F1Ap+BTRwn<{3Q`2- zzW(_b{^tx(*e=)~B?-z{8Du0Rfcf_?*Q{FT;T~V3KWI;t>{+V1d5sGcm#f%^&-1N& z%HBrp#2qwkss_cdI(T)gev`5v-J2)1k-W89V6BZmY--AD^ zFzj_N@YEH=NDZhvn(czyieK)561WaTraa@x7O*JpHD9ejPMp!s1W2eb`vhzrwt=J8 z2U0}I5_^V?>XZdiz~Al(xL z__hpsLGqMRxk_)92S}>{<+=zzK?pg0o-Wz*>hbxv2XfcUIpwcB>{h#1Z+&wkqC56j7!|0ST55}ytlcGoj zr64=~(yW%QU*rz>o+);jcEZFYTR>_z3F2;yv4#9f8qM^oq)t*8G=3?Y--GjMbbXab z?F7W4z=UgeZYnEoY=GFxK=v(#$sn# zlf)8N8!gaZH1I%o5b`mv#A1nKu*-Ji$-nd|Nd&3gm3Y^gYZA^Tsm!r_Tb(xV)l2pm z^(r8}AJLvFG-TojjLD{-5|;YSp9!Gs;wdUY$>>Uo*M*W8(6M62pzI2KM9srM$)FQ0 z`yA2o@@RrZV?Qjkd7VDS z!4Ui#DUZ*ZQZzPXcM>$u6sF4>7x%Gm6bBY^4*#-*KQ|i>9a+57(;p1svzKT0G0TXf8rcWO8%6clrz_9t@GLAwj9ILS`U(yzD7gOBllyHEQgTBTH z9_^zhlY-&1k49M=08!v~ZNVR?s8)uF83C+lW9D?1&QF!1>|2CFYAABHBT6fN9-ms`o(k{#b=yd!%e}PaS5u?(n%`435&; zjD8+|jcgG6S5$Xk6(F_awyCgchF29589WrUP=EDfKSGX!M^Rtv^TKazFE^@pOPZb) zGOOiOaP{*i$(;G|{g4-%xO0_}{TE(kOdqjb+*yLUqw7A3iUuPb4G$osN6evJ&au28 z=r`o32uz%qTe-BG2i8^fAvsQ3cD_vI319ZDVo;-|P64MzVh-+) z64|Z(^o_HPS-NfQq)mV_n20!MD3kp&2srEsoHL*C4QJGq2&I&$_WliD<8f#{wu>qg(B%#C9>3-o%MC;WDDvl-q|zra??q_y=95ypcjOZcx+Q8*8bg z$pfMXF45TIfpWvC|1QRyU~-+6DFX7MFhU8`uV@9F{WM8Ows9~*1q@KP53&l6?hyDb zSn%JG5d9opX1jTM_IH4jqtAWDsr)lnrHOcylQncZS7PDEYChkgy1a?(H#zWzMN=}F zgcs~lL|sNzN4hll8eB|X-mCUGHbHYQc};nVK6g=$?FzT{ZsaNtfLH;t4?kfA(I)y) zlUoHGpaf#biSG?kz@Lg{yta5p&E4)L_D>a}CBB+1L$SL2ZF9n%QV~X6Ua?)*6w6}o z0-r{k$GsqA>_4I~7MU(}?K;DQddYD`4q&MG>c3#yhAfY>u9BwJyf?*{CQ}=i-I>F7 zL<$b#jFCA$;PR4S9^z_=^Hbt5t>|fo`sz@|z8Lr~(#P4!vFb-d_C4aR{@aSt2A3}j zI*FlrmO01-NGn`V)S^{XyMhm_G*fpMx^L*#Fwq}+hm7mNw=L}y!U9xmnBD_ovJ$?)b3}xaEK;{rr<(CqAl)VG@_2(CVfj)21sraw zEXIwM^&)YV0dEp~pJ=30O!yAc@@y+zGG>en_KQvO23y~dD6DL7Ekz_2zbimYmtnFdLnZTw^)CT&W z6_Dx0J-DW5(g%6lJAxo5aq`~OjogrFb~OP@(u-v>HOS!k4sWP2q?I;wA0j!Y)(uoo zs+AR)KUk07y9CO~reA$xO+uA{Mp-{0o@E{Y@kuR@WmKyV9SkuzDa>fx{8_dKY=)Wx zSmAC@Q@|$yIHBg?i zi@UESb}#>31i6 zgu_@|RsuvFqENd??B^zt8$vd0K8j$-eXEjs8}*IlI%D|)A?J(1mh3cEj^q}&*b6V) zdrx!^$ImU) zJoe6@sk~>9ZTP^rHi$tfWNU<&f{K_{HLund)NrE@IyxNaK zd;6}&EpP_y3E6kJ?#Mh)v-ECEL_o~X0;`QIWXWre><-8F7ur?7gkgiOk$t1~&s#Yp z)(>0eR)Fh`1HPu+p(KrT;VD`HBC7aN6% z`RF}6w3b~LMBqw#irYT;!a!+OoiEjboYjaeu3}wt2#O+-vC-e(*nuzAJfsGNeP@Qj zJI+ZPw)F3T6eZ6hP9H5%9kgW_5FO=(DJ3UtW_zmDgoo%G=-5Fq)ow02W$hFw;@Wqfo4YG+Wli zTCSLAoK5~mLcS$}aA?+!vB$HDm~XEAmVRwW1|-!~L|>eDZIu%0p`{NrqJLUz+P#QD z?G{CW;|y@1oL=(AD!-C zo;0%z&}zc}z8)UjRWEvqg9&Zr%Od?5fwVuZOC_Z*M(37Zxa~tEGxuuZ^zElSI=c`c zeC6TZFs1&|*pw|gOn66=DMEQma<>uL4ch=+G(=BF4?H&u`MDMSd{S{;CemT+53eNj zC!e6Q{&T<&2Nwi_%4^om;2?uXzi^FEC|7v??h8ehVV|rIJZ0b{ot&4^r@!B=>_rDY zEYQYIq9z?p3b~y?&7Au~bI7&agt#MB+T!dU#tJ`jQ9AM^)625S(=!X7{-Ci9Kep05 zJoL)j89Er53t)xVS-(22WFzS{HDLrDNCV`pc}^EgKi;>@UoIACcugcqey=D&%ax{r9&P`ILivb4-d055P9ngofo$WOKK9sMKH#}!8CJ)LIHI`Su_yk{H1+hQW z;8<|d5mc-E(kV0uZ5<4b(#Hrq21UWl=wIRbo@la%{%M_Bx}Epd&hC1(`Wsz~GPmB! zIBqVhdRy@+?uQ9Rp6)~zY7L2LP97;o$Qfdyt)N$xRQX>KFjKogp(kcOf%J>wqwqVm+DO5>y}R=Y^TP_P4*Yl?YiySi%;%m&Rip{ z3{aqXUDUrjLrSnonJC8swnlek8MCA4n!qw8>SZv^eN?D0VudOS*VsoBEyniNFdNbC zTsbd5%}Q6~psKa&#ko+XRD*YYeN{Cou>L6Fa}BB*bKGm`<*IVNQK6C3;zml1&51zS`Shrb&%JR zTMSCOU7d%R5kWt6D6X~}>~n}ynf{9(QVtv5)PL|>=jDEnI*n^DI$jMVmK+JC>S%&Z)T3*iLcmZZa8?{KnFSqw z+vb;GM1^$l=4W4#ik6&C{?F`sWorZcKMpy%P!LY#XqEV~UU#o-rW;x(OxFBkb?@1G zLW6W0!f>dR#3eu|#WG18hl2k$=HaC$=<`1Us{FeDA8Nk(L)@%s9q3ina2K6!tcUI< zTTG`t?SFM~!-X34gMG@OF=?*;cQ;{JiOD2eJQPRsSPV1x0F# zML9{v9=ascZB3I|4%&RR{5Fn+n0=?TW+yHmG3 zAkU9zhtlpMLxeT=v{YuE-Ovws+<4jE@$WRoioJ4js(>=sFZd+6e7j8dTx7MMIJ82u z#JrQqIiih}$*4p$z0z1FYE!uE<-E81VeOQ}7aL&PFwiqf2N)JKHI9ZCe3T4rED12a z^5F#z4I+=4-U&Ne&9V8V+$7wi5dSw?g*3PS>H&ihJgzOPW__#F6`_7g%*50gG@gd* z!qr?e5wrL$)=B31${;lD4{x0rv^(4bFJC2}iss$0Om`|n$L93pX(BCr)-eCHM5J@|#;C5XNy2`CL75ru3#W1_VUnk;;1&Dq0myFKXFMuxS>8tsMc0mHvj5Ndw zhjMoZdc?_0L@aOQU7eupN3{P4$n|~CpBmc9ngF>G74O>mmiP_3oi1Lttp5rGr6jZf zw8AyFj_jp0aa$Z+ZQ#K2vC5Uuq+lWdg>lSqA8oG01CVQiqYe+i7DJuSzd-G+WE&Vo z0Uo*Sz>kiy_6A2|9eRhxl;lNpAyAO<$3Wv339HnLss6jkVLGy!?$VK|8i>CCor3ej z2W1&#F)H|l%`OoAUXwgl4Kl{&)#k>6tV$rZiF3`vX3ZG3vgVDkF65Ce9V8Ya>ie4h z#|J4p;GGnsq<(Zrb)+_O?*k&303nL;8XBGJ;PpwBIvaplEY)p8VxK*fXVq{P+23g} zyvO7S(L#5k#Lg$Uldqw$U^5A~t%D|5^GqdIvGb5ci3E*~{bM3^dIZ7lo+#04FdjFe zVoa_DE8r{%O#U6w=7b=4T^NTjKkJdg`5mt;kO!leyv^n&cOfo+r<#6F!WxI7JrOA5 zq9!haT)_NzP`_o~Uaq?nB3b)(r zeP0S^bH?tKFi91m(bQIfUcwFN?zW`cU>sF8;hRNX#G~L$C%8R*RxNr?aXf+Cs`rvm;0231W|m0^qf@+AdbuthU~C(Dxl?wY2Aw z0cT2&#DYCIc?*KqS`@+|y>95SF-4IlmkJ`?j=RrDkeX=5d5JK#a+6nY|JB;LveNoB z+F?JlCm*IJO)~$@@^0jD%}kP;kO?fMG(dK;3G46Z++X1S!l|Qlh_&DmO!q;uAwTo6 z+~lp=G!8l6?Fl!Ku(Hd>7|;OMTV-km>_Oaoc;9ta=}tdEca3JCO$TNZzpdOL$YXKv z^t{!v^nIM0L4jkL7vg_pY#+xf5%<0E>n6ivG_z%oUMiH;MH2zNd2c@4WZFt6e2n?$ zDVQ(u|HD_ZOq6WDhB}`B`6s!_Uq^z*PWv`kLHx%WLGHUJWR$L}f5IWhGs)*&)RXJ_ zy66ED!=3GuHDAaH7gLBW=tF6TX}|n?$Ldj_kX&w~O}XSKQgzo&aKSl*({^a;-blYu zTX;_EP)KqyAa##{nqHB6>{jWY(bQNec+!3$+iBMke3SXa3k93pnjRHHJzMFkP%8#q zulUD8HZ#r%B+-@_UOo74O2Q~r7k^?8WBt=J&RU@1o4`<8E%&!Rv1v(2xf4Sxsw_da;DlO+8prwfD-HR~CMMJT`3?q}jWj zU0r5!Qg+!zcM_YKo=CMAr={w*Y)x-iR(f{T>jb-g&Si{_V}ytw8}@M&hAS6^(uT?f zSJv?$oh)g1r3{hn(BgClE=iA6UYCfQm}(}Xr_Aeo(7;IYTlw^W+gJhg0u)|H4p6N4 zX5Z_SCfhB97V5N<#5koqwq+qVcw#c7JS3mw{iZ21c`x7DM~St;RVEj9P1}-BrY`mp z%b+m?qH^QaRFw6Nt(sLO`&C7&!l&1O(23PpUQ%FW9}R3e>`GMfK>h@yIO}IO2PmE` zdydi*-W&+QIEQ=BelNe6jre4^R4^7zUXgHU8uTlm%B9Z_7og~KuwOBY6ByJ-yXa1^7^v%X;pGar)0 z2D%17CBB&1uSx0r-7-`1+IV!SvFY7pkx%S=cPyVS6YgE?r$ zlp4V`ILTi`Y_n-ypJ_CJd>-mDvweE6qK~iiy!gk7Bx7LDbiQ6GOfEnS( z)A1?1ctaOUg8|;#K*Lep1R`m5FUh(}fu)^3D+7TzXft!My@7$z)J7*cQOYpE`<_v9 zIFCJK8^F*9@l~NV3&WzGjcsnW=d_Ov;{p1&c~2qy^i6!to5H?p!UEkRGT(L?X}#>0 zU|+m+!kZ0f%<5v54{)K22g%xKcc(zhOewn!msI29j($~9+6&0Kq{E-X1QKaK1eeSFrNI z{rBIov^>6;*JWFM2i|Xm0;drt&cle#&dT|632j#O^*?s9HGr! zrLI4N?6I8A65Ei@%NV0lFlf#G(3}9k?K8Q{UKoZ%w0bFslmz+)KR~6OuA^Fxl8(OD z|4L_tLSrlFEbkOA@DwWT;SSofZGKl}z}Q5?NNCXg7`pOIVK&!3E4q^4kP4rYV7HL0 zan|(7F?1CqUSOv;M`k6r++7aX6>3&$E0n&qnFSS2-^kS&WqFDqp2(XMRM1{Y334^`dU~~ z#GWgJBS2|&S?5u(cNkEFzb&yc6*6}XtT=oFC|nUr?sW5oX*w6%zc!H*SfTKFZuIw( zhwKJOiPRyj;ZpDIB89GR!%^HLZ0XSyy80)xI# zQGJFq|+#g*97OX%l8Yx)cwS7{`m-Rljw3Iy> z+fA_;RRRf{>#M%miFC3(EWa}`KtqNgWI4UZcg9-6 zw0fj8Iwzv6xLb>b0}%VUm7>@UAt&_!sIw`U!SkK^$HxI9=e)!85iZaTEnLd1YV}y5p0zj(|3guiFCNL8P~EVhmOW1 zke%Xrr(>vktC8QiOXOh+((}l@O@mR}# zUURkEkjdil1M~PQ;P2sF1Y$K2mCO_@s@g^0OpDesBT6DIxVC{x0Vt}y-;pWi{_$_q z=~O+g)e)qsZf1F0iEDe%y7m%=y#KsrK zdI$k-ormdtyg4af3F@Kg-Nc=)_Ldb#wIv)m>3bpZm1;SS66&26s#Smh1gxoX2aS19 zq>(sr+X?W(lo?ST*N-!Fq=v636x^>?@bj@j{^8w7Z9^@XU~A41D}~NjUZZh;c4a98 zgx1Gf(~5{PWHYla0#ec$;p##_vZsy+C{8erEI*a}4P(QOz*M5_xYyZ?D223%Sga>} znyVvaLM8l6A#2d|e}y5mZ3J4u?{FuG8K8oljvFJFwR!8gZ5pkkN~TjYY2=BB=xh3c zp!J&+k-;QJj$|^99cW=cEUtpylz_hWEy|3Ot6iTEa7N=MPz~$zA7oNOReJKg#6vF- zbM$(NgC&e$CVEsDtWUl78;6cv!_eYQp$2?D#$;I^xZ|p z)E?M-(dW@!#%2Pfl_Zs^@6tY@s5HRLEHz7~WgkvoT6W4_pXEO_9Jvu`MXhJ*5BUT@A$w*SW!r=tod1PQT@X&f|AaYbgHZ2Lr9!(Ea_tFI5nW4q z^a-%iEC^<|Nryx|;*MeG%P{T>kt^u?Ig);(gC3L3^RUp*19Jl|2 zDUwcDH3jTHz zKWK6EjB{L44mmgwmvH0Kwf9Zcl@D}W%l4AVQ9?|Sa{XUj_1ycYX;pZw(={1mC+iB_ z-AkSU^$Nm_kHOv=or*2A-8m5IzmS#bQ$rOw#pU*z&3JveFBf=WI{+_-)>J^HJbA-= z8X=7YruOG=U>$-)53gLU3xg)Bavc+epP2W;!@P#7MOo68l^@~HJ@xL#W}E;4n}m5? zbm*;tQ&|&X>s~Hl;d?Mgjt87L`4+XH=&E%#5KjoV8|94*u_crvGR|PV<&=^X&|e9C zm?C9M>`{U{$5{-Vn0(Fvj1)G|KWN=OhPCEPRq5+TM2Ts1t%f{w`gckn2es2J;~b2B zC<%b0Gn2;BjA)QY4l?5AMy!!!N~S1N0j)1Fds%a!4DgaL`nDndEsAO6RCO@1npY3}nDz ztE8KvGg2}gVmVf+1AknUgP(Qm@C=1kP^mPi+sPZFnY^JFUJ5S^DD+mp>U9)9+E|iC z*%B3N>RN2Z?1Bn5Qhx82+4B~MSC%M@3^sbGk6O4fN1k`#PPn>f;Y!=Bk?X)k4QjL6 z)_PHpYdAVOeJY5M(!ZBxsj@tS%Q)}zSpeAiPaoRD4bMBpwVJonGl*4uMl9@@pdQI$ zx&!cMbMdaikm5?bdF zRV}Q6c$`eXc7)@WIl1Iu5g~wbXF`1)piO5f_cy^bz(@;IYSvN}!W7QqgTtNkBVt^c zK8Llyx|IICfz%Xbo<-HghyEE+rOxMcvX;kPB%&F8W~O0hm_dCYv|g09W>0R(4v)7Z zx=BnUfbpu8h_$7kf68R81o}j~ ze^%fZDUkJ04;+CLFuv~^mACy^u7h*ixoKB))mVI<0QtN{b`qWj#B>WerxbEYUv&9< z8rcGp*ne6FV_MFQ6_4H~`k`fT=d0(scIlkEdD03w(bVh20kA^- zb@#q~tfe+iQ7T_sF#*P+Xr!=>T#m5&o4xMrdsv7tyWz24IKKz#4$jjSYkE{Md0gk1 zvgBQD!Sm5U#&y@lf7IJRWA3~ZhY_3F1I3u=L|+!Gt={~lDTCAV7+1r%c_$^GojWx^ z!4fV2oSo7xHMkAUK&h*SRZ-CxA_A8HF9Ztd4HUXs^gJ#%6HImd%4(=q0S#^)V0IeC z(0O6NPRrE3FwA2Ew4cv;G7k>ILF-!Kx|)Cp!lzJa3su)QqnOh=0x-Ew2rwRqYM~LoWPfHIL_sIN z>s5j%IfNQ~wj9Mltp}^%k#pj%5n+bt1t%(-i0VLXMN=8}#|FFgX`Mi9K8i;r%_%eUFg}E{I$LsQ*PN2r8Hmj?R)S(#Ps*A`w zdvtjF*lUWfovUC(@N#Po8^%o7fOjV^b)=Sn8O$YEQJXN%oePEl=312>lCRpm)8=t| z%4ZtG9O}TVt}e;Quc@~h&^}h5R`HFk#4(D4Eh)Zg(Ulh(__UJx$;3r<>o|$X9I4}LaM3e12Hk`;#xe|IFSCvMZh(~`qZT!sYnI3W5k?K&85Y8)UiI1e( z!>aEQjVu4S{YaYeDI4-o*=KyvMxWf~R8o^`m0VftR{yJLzaU`R*?+al)k&g!jwa1n zxCk}ACHNwwC=l8x79;k=TbT~5HosrPuK87eDCFGcgPK$)t+>h8MX|*(ZsI{P6ugY0 zR%U5d%laGtsgRYv1QYdxyz@=oxFdmd*tuPk9MO7zuJ`<-^(KNivlN5O#yG0Pa%B#y zs9i+ONUsjFdif+pi8l_OdTn#wNXT3@G59Z@tP=srVQ%A9Xyw&Jq$LWAwXU)PSM@n% zgCS%!`kOD8k!Cj2Y{_UDJ30D6stMmw#0244{`u`(Vf%iI!S`Rj#~TRF%F0h2@;&Xo z$nKam`lu<-6*E>XLb(ru&?J7P$g<|lzzGqr>;%#L@n6n?QeeC0Bsh3G$6V}q)h3(H z?RHCGrJ4=UuqlN#VL@Vl!_$+aA`xbm26f-|Rorc)Z=~|Bu}mXMMSHr-d&g#$`mn<2 zn^E#p|1>AOv`F0t@qhBS)gz?2IXW`k2)Ht%o&pwL-(sMT8`l${E7$tvG+a%fGgi}# zYdL2H6MVbe$Wz*J!6zGX_U&d>Wylf0vs$81e8k&^-}00^ga&km>VA4pT`(Q3daY-Q zM`rR?^Hg_9(Ep*dOcmEa{HTjPU6}Ek*0mua>L;Q(^Bb>Cc@Zt?R*@<+X=%MkTFhEI zfOa#_iVL8$VFJg0AuHlIbII;dS+J22eWpkv> zNCTRPXdXX>+!r0roA^GBNT`CaD($#h6qgy6)UBC`rZ#`3NjCXmR6|8M$p}@upGrDo z8mr0$cr#gDUU@itv`6Ybl1*9x>BY6>t{WdQ)@y>^hBfVJ3OCP^PY?k{gMBG^WhC8O9P4sk8KaD(?tKYmY${Ee%!4E51z9>4WqvfYeiiLsS4&S_;byN9FG!VNF}m~!TrnQA90fX z#pyrRi#PI5+>PJ2D6u*i3cc|ypGEhJLo zetO?;Ci@vYWxn@ot!uo8ntfo=+HYm1Vo!2Z4Ae6LH7F83KsyBWt`!Wu{Yvv9woK-l zYyVs_T#tnK&Dv=oXK4qflID7t&*w(gQxGVU!(nE`+F1fsP};;=DZR||R6=|v&qO+X z(W4>36cv?zGD4gUiqEd-48V=8nSP^A4CuCX2#MQqSd_Cwb#v4NQgpgNVj1$d+Svt= zP+lkK7&??M=Mbq8EKEb2=668z+18>1VtxIwv_{=fUI%%w!p%b`t3k>rWxhuH3n#{q zfy9Nh5AZ?k_aBo_kdl$Pv+1Q#+6P{K2~Y@5IQ`RH9$pAiS%S+UuP;Lrz2< zuW>wvRt+GZw#Pa_OlU82c85c+2PQl=7m|B^$Z0IF(?{w89O`i@pGAcL()oQF*b(6h z49W{@UH__M%77G{lhNGfj_!Ff-eHjH2PHwIm3gGGfv(R8b5bL?EP3I(5C=(Yj z2xC^8;raSes5OM-sKq?|0MWt#MYXY$p)-Zk>VwH^#)Rm25Y-$=NwG*Z#~(7}U9<%g zH&JkGLk;Eg)^Z7*BnWyIoQX9bo&+IJ!TSk==os3{47^JtJ7ovpjiU%Ore-DPmqiHq zkb$97!A--}N*zFzwymf$$NYB59yh!t)1A?v7#%B`er3G0?uSj*V9xV?v;7eC?ak52#i3a>8qxchS8J0R5K5v0T_1UKi^6%_*ro9x8E%D&P(r9WDv?N|qFm zzVa$|>S`2VheIg8K%}Xhn)dzf!rE@UHQQKDKcO%PGw`B|gY~vH)`{#0Yr>u>FJL)d zhW});K;DZr?FP7+MR?)YF8r|7>KN$&iyu3u4dC(`DN}MUm@4Qx^$qzWlQXjX@g)BH8hem}bZB_lbmo?awx-}1;kM#5r>?K~5I(&qxhqgVCK_}SzpFxlW{V*4~XId$HgGSN{2jaxrlB@k)YXsF~CQsolK6oQLpn>aHg@@qhK zbJMK#3ifn`I+#Z@*mezW(zPfwd)bAlIx6}(+0`X7zHd%W>#0dYz4u69g5l*Qwef+l z3+C>WU@uQ<*SVYwL&|;BduNal2X>|AP&e>v6$+D5*2FE7XCI$TjhN{~l@zaY{kIH& z^c+%e8pwP1kMlbj1%*P#{P6dSGCjDJNl71uAh!0R^xxOHZ&qw&w|^9kPCaZ_B$K~M zoz|ojXp&_6Oh3q@RzPu)yr8auii(iQxqrSf!0;5E80fsUGkfUQ@Qj z%b|54dfvemN&5lpEE8B1w5(n^Yzi(zxtKR~G{S}WtGjm9eS@oJmmn6(A6_&Z_`mJg zG|!ro9nDUcGVyGqqXg!JJsWlH=K({&xVqdZRC2%R0i-T#RTcNzRi1=pHfs*lheT13 z#swv&$u#5R*TH5s&AS5Cm_t2WP5mSWZ4Zv^zFcZ`GsImtio|`WB!W)EKfvSog*d6n z6gG+wx^wl;#KLO1+4&y@Hg7^>)Yx%*y(( ze%&=UjBDatb6B&P29!i<%V&W0WnQPe=~Kky^(1Q^G8L1wM7kkKP^jr1+{?A!M79J0#37W^eIcvf7YMt^)WzYttI{*3y&lE-##;p9$4}soIkyY8<#Jlzg`8Cl*B1%D zlN+-Q1{+D(bmPg9UJ0#x)|$P-gn{^QQk`&%jSZ**0e{W+f5#E zIR7qy_*n~6751iH;v5bpFFDgTvu*|V%GHQCnDLdAOvATqWw$N+=JtdR8|!C6mat;_ zfWX%i(Zen6ltVY_qX%}c+6@LkQ$FLoBemp zFIx#~Wlj>9uuGXY3Imj+DsXcnXObnZa?3z@4m#B4Sa{o$AUeUHNMXTjCvrt%G}J$M zfkO1o76ML&SG0zk>&ClUCQp)DdUr+M@vB2Qu9G$GjUR{3$Tr+H+!+1sulQmQerzoU z#ySUv zQnVB%>$dq8vX)xp=I6rpTL)Ri`q15b&Wo%oU$8~izoeLf!zY=!n{n#oJ{;sg! zdRM<4M7}wY!O!diw${7?4-sOx31ASu>EnLFvV(hctL5a`t}CfH&fSu^|7^r}bwUTX z7_QU0l##;ss%YqkG;}ZD)h(nOy!cvz&!eGYub;vDn5m)Fs!to3F>xkHORNjF{dSiJ z&nI|S8p1?K;Ul3Sb};;CIfRcOh}LphMC7b1`eP_L7j(1wKiXM$V_18$I$pp=7BK8 z4$k&U!q?=6LV?9)PJ)Rt0+A3Z1|#w0zaUv4NT(-%6BQLdF<7CIvp;VM&{XSy;92NL z?DhMVrXM<%=uv;`q|DdpF9hLeTb*jwICjV~nO?v)XB2sq> zjKqS>LZ%KiU1!(-t93*ykPfSnGAbMGp^b)Zx1EPtZJz2Y!8bJ3($%!rB<6BBjD#0B z9t2p(PxeV_|IfhV0eL3hJa=Ku$oa1~j4sj9aveu=XTV{`2vY`rgLYNs*adT+9c7i* zDDzxbGE(7!w$3y?^x_5!Ao$8$9se0KNed7FYv38I#U{TwF4*F?p`@_P5`fFNjEou7 zQeNjN=_&S4TZ!8pQiQ49yma3qV=;Ea{O=*w1^faE`;Y ziI=q}xWt`2%^fJ4dIS+i2yE?mCeC}_^7m?Q@N+_p`_tH z<^3i@8RGq{LHcRVJlTUrX>1D#i0 z9$+=F_nN9|1f?Pzcz&R4MX2ajc{uj(tmOm7qR9_&a~V z8ZZM)|HE_9dl7Zcey|ckZiW)|1X)BR!2;HwF-OtlCsST>#eQ18rTxK~_1C`k@LvKr z2%$`ed&eV*1MEib(|@AoTV&14QiO$<83MokvbvtuODAk?81Ge6;5I&D0X4ipXGn*` zpU6qcC4%!%wDH9XjcgPm+?dmv+={`lA2*eTPvj8J9^(Us1|PftQUd{;dDzSnV=HFw zFi7#+lrjsPu5#B5XlTld{^T9TjzZa9Ou*;c=I6+zpi0!8lLF-BJ@KV84jX;n#yb^O zUNuMaC0%8al|V@k2kE*D#$1om-!?xiFm|-bbCI!UN@=Q6uV;~$kdq3CU1AyH=={~? z2^KT*JUWm+c_S1w*<%|dsGz2w6PX^@0B^8GTijFM7+|O!BL7u54UFC;iGy&Y=`a0I z-qe04&ml!i5TRJj$}^gO3WBqB;ikEjZhTU(hOt=PBc>MTxZzjalQH~ud-Vqg3VV(W zaeJXg_{UYUJJx zQqJU!ufnFCUEGK-1r-WE`gJ0E%T})vS&y8S^eD@2ZA1wfh7`tsh{2XyLP=J=y~U4> zoH(6G4cL3ApLv+43|9V}I)7s z!x@?Iv~><92`Ys>fW>>BPd1(rfA!I%65jW_^qx#`Z}ft4Q<@ zh(Y+W(k&xZ=Bl#LZEhRnJw1spm~6ow#%S|f0jgR*RJaz~ak<1Bhip!cBywfop6~TA zT+xZa;f`qJ6f>;C1{w}+dztu>-v@*q@&B|=0k-s`&mzh)N7QEnpN)KY=Pe2yn z3J3OV9$e%$MHp~BL0@*wr~!s{`7+GM`a-wfi#w2dsRn&81w@N-hu`2q-ar1C3q~cE ztfD-Usn+U0Fw1=$V8Gul4)@eb%g)Quxnr2oWTu*lgxFi473G%>!|fm*?)UrhmiSzQ zLI`FhHFx6Phf{P!za3)>wn0E&^(v_67)g%zUrRjjL>pjQmV1FAijLU6VwK>FGwR?R zkV75A6Jf+b^{$%SM)4aPwEjCY8qCvQ%!VQkdgNm030{brNC-*vSIjrqjjHWDO7`u! z3Zj6J1|sUpz?&8;$k1v3IQOKA*y;|DGX+&r?Zu|{65VMoZ3^HcgCgGA(104!={%#} z(rMMq5I_pSlM=&oLiqy`?bsw648V%_-ag?&*%LV^1<`sj18&-|<}yo1F;`%lyprp; zypL#IC>ZcCy>+iU_MarCQXun0r<*_LvOvyQ;_$dkruAw}gg<^!B&9|WSC4h`5A2!D zuKcT$&Ft<=JL|K4I8|S2AlDAAq-YDQo8w|OrIN0&^|p*mJI7DdpPX|>d1uC6rA8@z zhKombGx|9tGFG#tx{CSxi#SA3ea`;cM@#_@;MQqwahCn4!`kx_8Zczo=O;T+QydXK zT3xCBwecm;)z*!KT@afxI_0AWC#>DUA;iP=dFN&j%-{b%3izy=sKmR#7iVpSHhgH- zhOOi*Hu0+Pjd!Tqgu3gPA97bpnNlG^W*k;|AuOK=gxtk5*j;VJdyR{Fl^tvMdg))( z6rin5brZxG&3;9V!y=WKdM;(To@p%sJFY-K4Y+WNf}OW#z{!{nSTXgf zBpFnZpf(n(nBa1_gn=Id7U0GZg+!jg3TSpos%I%cKn#ca(e3>q4GF?q?b(L1bQTz> zAz_S{HIaVp5nNp+Gj-e2f%(M8#Yj;1i)j=vJaa*4{2w#Q&(BNEt4XUnCQ z70LU_)^vPoe2Te70XwuVjCy05%2D7EYJ)!^^GJSDL5;^(p1*O_&>eOZff?N=t`3oR z!R(%!AXYjX@=fOI`*JGT%!$UK0%5KvTU0mo4cK@c+cX?H6!N2r%?(?^7Yma0ztp69 zxSc-I+Np2!v##rEYbs9cbSG-Rc<#T_lFhDU~fY#o3OP z%)Q(s_*zmktgYmNN~s<({R=wJ5J&x&AvBT|S3}>Yjt(PCw{&bJU=E0>iBIE<4jKyy zrY(yt1Ouf3_u)?jIC%%44ZMYZmE!fWz>%kgG5;xxfM{c+c!ZP3<}Y_)Y9XM}_Axa!P6}A!*yqJ|n>F$=MarmyD(7x61kep-p40IF+E%$l_JHT| zI41Q_Ppn%i1GVKVk!Z<`=L@)726hnuhA6*6wqjZds@@(xf_AL!1j(pWlJz-ODC50I zb*FOev$}i-E`BeH`ITiVYqpLag6fFKqGzan=$YtSQq0G44?T#C6Hl(AcCHDwn4QHr zb4QAOS0gj8Lm^|BKE`E%BGvc}BXueCr7h(f z(j}u)=NI`y<&*zI0FEee@}an4q0J^_()E zRT|9qB-{io(h$js*m2cVAGjjylL+_cQrj&K2Nz|qD-JK*D%QjF4-R&c>N!yf;K9@Q zzp%&t^S)9<0{|%-BaqQsRpUpL za`qa#-;L~Hs^lTIMxh;gB1Wkt;~aVFE6OKQ`l`^NQoe?v@Hu_6LaBO-@85+S+wOG>?w&gVyJ=uh$VnZ>^SY`S${57@3q=rUAng zJ0V%)^}vwTY-KKlg32A3SZ=o?%==t4OKC}S6y6E|H%GlQ5@`MK^!LXQwCx6ysAx4A zA2TJs!7q3pp+WH9hiwbOv#^^gub0iXPoO(zMs{pl<3a7BR$lToI3E6o^nz4C(ulPk zP7uYjgxV{_AHfnCkICsPp)iafpC*vMDXL!#z21;+<1?39hBBbrhsC})|;DtZbf44YiJ=;`VsgNfE zbQ5rDdIRuDFM6)mX=<)5NqUUJBf5jA3&R0OA+Be}??pRn-D2J?m`KBf~&|)>ezS+8Y*?hc-s;8 zXD$ZLTS}|Q_r1i2Kr#O*QBDu`ht>tAwngB0k}{tHwn_EM8oM%adv5Yb#m+&RF2Np| zs4wLqvq;)z9ISy8y7)l9$86G`UI`R$t;$}7U{Bd++pGT~v68p+OM z7>;36dB>^@$HVL0@4&n|c&I1A9;{E2F4&8~*DI9MKba3odJr@lHU0?t4%fSwI27nQh3^rS#4h=KT-zA`RejAV^ z{)KG_9S|(tGIS{hN;xfK)?+nr1lr};A(X`Dcsg%YhO3pnsQi&kz``E!o!C*0UUM5I zW;&?&uF|k@92mgLT^Z3x*~2Tj&Ljr7uJ#_JA=fswdWx(6m13G)f0epE3O_cNAI;s7 z_uH=rd4=jGU20rO@;L>^w;Bd3ova2{Fx&qb&o z2;Mgek&yVT&cMl%tOy&YKol27fankj4~crX?you@hw!6E_L7^mcv|UMU`7<^9nFq% z+dcY$2JM2%OYXHU_!-nME}8z%eYKo?mMZt# zLA%16Wp+Eazs4H(GvMwfiq!+wxLWrK6jX;x@xa3XCpT)fQdt z3EbH1;d#;WS;9y<+)ZmeKYz7f^(39+qT!oUj^uzjLR0=U&Jf>bN=o@v+F659{0&t_ za(6cm5xX`?b9!?|AF|4VgKh6Lr6te&!3(~L!;krMF}?k)q6p&PjgUblBWdjWz=Ye4 zPAWS-U^}f|=Fw~a*ElU1BHEoze1AJS$@Co+4jhsj#iObTvT7UVIq`LsMI~ZhBHr>p z2QyYg%qP3tq1sA#ayS#qyoli4%T9vzs>$N9E76-qZGuN=EH;{=^1wYdw}JdMC+7<6 zYO8)P*nty}SAu8p%}q)GD!KozM= zZr5QSKzc|+B*J0o#b&cuv=0&Rmc1fe+L8XHAPosK{l|6F`CNG~kAq9~1&&zLwPsj+Ma-&)7m%p(*RV8iO<@#D{ROG&j_&MtCb# zu(DaTs$nO$|9vU$u!fk2#h6-(;Vm_cbH!@yF47ZQ zowFaOpF3I*@nly6(j zA%SVBRj#NMCpkY_NQM?W5u-?T3hYJ$q^wizkrNoL;Btfj!wL8h6GnP1 z@rgL6uZPD1&N~bPn+*FI6X*ighJ_uoxIfkeuoIeg^@?QG+cd)rlA;f5Z0o)-2S%&w zG%(~)+Z_N<>nn2XL2RMBm!Vb60V8(>m3tfaHInVx5-gaT39nOugyZ(+c4<;O%)}`?=B5RLC3b0NdXrD<%)L|Px{Gag;V+fPmi&daNX1O}G#RXzL1pOdOJW5fXwRxK~j}j%OfE{r1 zQKu;YNx2S68{Q(D_kvm;b2jE4oXS05x|3{4vi-xU=_*rW;^iU6}G*W_PgDq&--->^b(?Gyt)OM)|fRBW%pjgi|iS@53SG4oS{TlwIEgY_;t@u%Njw!L;7r?c`=7Akuh z^Amr;cGT5dG7YY~0Lu)0`6wg7X+8{e{vu6S;FE+MoHO(*BqVDQl~D1APNmJ;xZbGI zs!lS*49F<<>X-f^=U79A$bYUCp@+)SIyh+$7cc*X zFGLMLtw80aG?{XayD)wG^gZ?f&(lzwJoF~XYMM1J)c*9Mrn@;3bGiUiHxHWlMpy#L zmMhw9e8bs*W>$CjYkq(atC@BBv8?8fs%0dKY-2M7e5B6iG~L&~E(GlWh3L(_j4b-w zw(i!%xLG8OE3(`7&|Ii96s2002;^ z;=IQ*0*%SjoxH4!8TCs&cM`4uZROVQOLjrcnC9je4^dT3S*yLe8s5(R2_YMctME2> z#nEO>su3f?A1V4#mFCy&U@~ zto=p%Wa_$Y3x%S!Gz7zI^)-o`t^a=ht+r=8h;K5>JGm{hp~tC&mHSw5J%*`ph9W}7 zqWgO}ctrSyx(6e$ZMd5kzbd34q;zWycb1|+^=DAJNvRutwn}Xi-ibt>H3s{8_3{W_ zbXNWc=UtiKGZZ@D%>m&DD9^bF)T-28lF~h+*nyRzp4-5|&)zMMfN~t*Zj`M0^fH$% zwNJ<(mW>!t?=_4z+MFz|E%zkCr9!+!4)!o2*PY-obRt$T1HedinqgVvNB>N=`~R?l zvoCJl?lDTA*ImA^exQk5;O_dsFqBkC7s@YHU*60p6PPd(1dC*zYafT|Q^ILs3H_R- z^%tX*wsP&ffWOi#75OmCyGs)KF{!4(!ueJUT0onu}q)`=Pegqei1< zljKc*37PolWUtd!u}dLPEq&?fbvF z$K$v_Trd|&2~*S0LS|aUi24i!V$^FyRISyHtFZKJ6soSrmKx@i6z%f8aW@u<05HZ% zix@BuZ<0QQLsAvdF4j~h4emDiHV{x>2{h`x<57}#o#P*tyuMM}2g&uZdLRC6Ll_1b z+X`SFhSIydYF&@$A+;^RPoepVy{ETFGDM&U%Eb|wvXH>yy^7Hx9O1#K$8zgO6+I|Q zB%?i(ntt~{btq?$d0B5-lin0W+fpxBAdp*=n5i}#G)C|S%P^nTHE}TQb9zL4u`)^W z5X49Af~xj)DW1^HgE>Dngtdd<*xRsmcW$zzB}hr|z$CJvmp1KS*aMO}{y5I`pNTR4 zF-*>WJ#aA#8ZB_FYa{hW(61mozLBGfuhJh|!JNo-+xjw$dL{m({LN^}=y+We+i)&x zP`LKd=z8W;;(bz}1}9$L`85&WvemVFAs-Bgb%ndy?`|vlwJJ9<(5sY&q?G27aHs z_kphlv3{rrK+E*LQqb@5l2q#LKx^#0@lA31#REwx+;R&p*rTIUhGL!&Xfa*=5}bOk zwmL+0w*UplEqw`8>7Ia)C;6$fSe={;T+dVKml16MFM2x000bl4-t7a@t?&X1GU z&h%;y4A4j=!Dxh$2Os8LkyhK$aw4H6z2rZ#*Y7r&umA*r-$(Kqw1f|SYaU_qNr)^= zCnl>bf#Zd+i4#VqhL#I{2QeRue%V{QsDs2GDDM=s9>ii#e_O_w&zQ$Ge&4mO;`Myg zJ}cT<;yYmQpLSbZf!4921YTE!m#I4STXKDGvb!t-CBz|{+IY(&DzOEtBR%*3n0-h% z45Lp+uYZNRkO}m65mCcIYqXlDS1#!eLOXgG@~NK^;fYgc*jm{n_zuOtlBTEyspKrb zhMNRGAt?h_n3Mho{{Z+IRBd_^b?!PvKX7X_WBP+S+)nusb@1=Vx1|#c)EF_quqSR> zx7{I;%<4is^|u)}kB&^<;;1|jQvI})@s zLBWtPyGv>Wn3lUrdPUO+I=~+kk!%qa%(}lls&00mg3^9@j zkoXo~^SrGOTry(Ae%l~TAte9rQ3FXdVApue+Di|EtiJr5OX0w0XOxaw0r zO83Wj=1XaI>YS7*jCgQz6OTgYP_TnuLzW!18G~HP5R6~OoH+rgKLo@G{`1k56`*0> zT9El!Yo|^M_Ro5KRxnR1x3*B>v`u>A7PH+i<&!Y!p~#QFnAp9x=uR9JSKtyL$hWAF zZ)7R*%w9z0r{W1SSEls#V#W%8=iZPaI1f3*1Yf*f(rXu0&)hx0ki3| zo<%Q_-JYd~GHIDe{Dz1_00WY#!|+&>|rD_uqVDfR{0KWijoes>$%FYn8uaj45} zY3~vH(v>`WfTCxN@b&$N=6dwIp3kOS8;Whjvf$bZ*D_&9inLrKtHl(y4x9tlybT`1 z+qBv*Gp!{*&x1M5Ax=%`mntv#@u>Ee6k(t=F=d#YewwaWOtYO+ahTi3#7dadNYEe= zOYtsw9=$#-Ca;BYnZpBt2bP7&J|cfm-tcUMFL&&Ho_}+D)MJl}fg>7p65VCk?1tR- z{AtsLG5Ev$xZAlyX-_f!hU%@ZNOeJlljPyGQ(cDr;kx;Fpuux11xcB>1!J+W?i2q6 z8ruE(>Mo^ZMx&AW2`p_1lGj#7s!L57tOam#O8_~eoMt<+XlcXFKws!Kvn7|G{gk3E zkV6DtABRQ}e;PaXm8*0l0l!$5i3j4(UF&PENIN?w9O(@xIW_z~e?W)4B(^lnVCYC> zAkeZI8fxWRGTvj8(NneUES9I-Nl)G??t)9^lQjUr=TXd2HfV)YMWr4ozBWLmH)aG# zB5D#xL-!7y4vq+{J6RS6}(~y{}v!=>t}9*?Gw8&iV>iVZwB6(Vbq$FDOg$KF`yvBmhsa zLGf>DE~>dwFZeL!QF@1t%=PJy=i91kKtcqcpK4<1^NA7sK;)7*4@@aY>7@V`UHbc< z&-MQUdQr$g18}-wA0Vjj#^XQM@7iT4bhJGy<~vzdC89AXvclipN+H|D6_cj)ttG5& z^HT_cOY;7uZvTu;sg3`nlC#C8I_ct6Mins`xyV4~&JLVop5di`-a=T4+ppv~AtECW zRfoDiI^jVBORJ3N|4S1G-{yS6VxdNQVVx(p^HG<)-8u#a-uH6&W{4|xAeiPx6i{uX zmmvp!pogvXkGPReI2Iq2RIGEn;R4;WWhZpfF`eRH88(M)cr9l>d;`w3g!zf&fuIl^ z>+?+$vv-=x8usE8z7=VIXR*|PVnD(a-^{XQjm5NgN_%5lCqf>^O?V2Y#DRQ&IxOW@ zLS19&J4$zMav7ZLo@SI`?LZFR^oE)#*k3uQW#1^bo?uMmaYm<_ z-s{q(s=C}sH2ZqiON7bk-qdrAKFPCeA8CuT=>WMg2VAO3-S@ojwzE*)CjgqR_r}-> zg$%Gm$>)Yl-f-W=R(dhl{D&xa%WaK1@OVEGk0s|AQ<;^HXKgHNn;LBsf%tmXf{gr= zGM|V*ta)S(bwu!B?X+=c4dz50yZO{*3|681Ltez62Ef%?rQejp4_5%9+OGmo7&)ph zZVn_H+yh9f5?ax3C5{0LNQG3yUVhB3m7ar5I}Pq%(0KOY4hSeE`J~~a);ceJ9 zE*h}|#1g0`XiMXo?ml}SO;?jhb3L^>MT0NT;CGp=pn+GJ-kAm=CtqL-r+=84Q6k#UHE*i#BM4UAW>y#S5m!&I;JDtitD zp6-kz9ai=&M+zjpQn*P%|2Y5j>qp7Xm^AFHXRa zpI%*FsV(!^8{)@=!r`(iX+!l8CZmCFORMVxGRMuBY3X}%p+GU^1VlrxQv^eHPQ z&t(<@qmB#rH-JCHVn9zQMJW)YUol ztkO<*zfhu(uwATJbf#l86FKjY0SLt{w>?|2_v%N=6MmpKh{J#HRNmf>e$sDGv&dLJ z+ptq*m*np&2H;lCZ>yyj=jRZ1aVquChRv{gJJ3m51?BAUO5Hi2w7UhQ_%Mji0ehcT zE0QFc1L>;uG)F|UjcC}xNtB+TWZHL1BPRgbV`@YZIVScP1r@(->8k6vN!zZQw@}!+Gcl<<60HNoT*6Wxh zgu(^I;gj}Yb8mAfYIRjYDrqqpUIC503VdJ(V}$!aw+n>|hku zd2Ub5*+%XGgSv_W!}#m4byzmfMx?1qT-un7{k9xOj?uI~MAwUOuhfs{Q`?pl_Qb5Q zlG8_c5k<~YJa14eM$CPd(EVqVEvK-3G4?{JKuJ-#>T>q!{ix_6pK*2l>Pp_N1^=NPI6`7z? zcWM(LY)OA^=o5CXqA9b-TZWP^o^fBVlOI+>aUw$wJVw%!5-i4y;l6kRQTFjrKnZg7 z0@l03FD@-?GNviqOo4t&)p5H9V|MzLCzs3!=b%|N2l&N!4W%W3mp7#l-9L3Om8WTw znpWgi2v%&~x@iUtY}rCkq(@p#+SGX{wC@dw(lUNem`fdVeAVe72|f7@uF5pi(K$sxCobJ8k|n6-~E2RRYB$2>DlaXKkB+a4j<)2Zdrpz-FH zp!=i_k}heY#&5U(XkIOR%a+cRF&Qx)gi=A@f1Ao_wj3%RVFHL{1DNz@%qt(whuXna ztV;5mVN9+B^DK6%HN-PjKm|XUZGZmdgb_A`pO%1YW|qkzO~Lc_&cVsdvxfTI!YuHL z%3};3bh|a8hYhCv9d`sW7P*NtdUle?7ff;#8U|^+=$J<4pJhru{lyZow%eKxnr9p* z&p4s|)8{43_!8i5}pb!edfpmIl=Kl(Xr0xq`4;9cVdH!s-nHjrXsq(y|E<0>;V-0;zWU2j9NeE~ryIHIGKnXk{ut zLoh7|p%F}l3aH<0y558@fwY)Wg=B$+w@9P#$+SUbg2WQP=z6|61@|nzSTlgEb9T(t zwH}khuBm;e(osPLx4(Z2%USFwX;BI4aojZ>Mn#7#gBOw<4oaRCd6l&SwTFwGW{sR{gyK8>d zOU^v=M&_T#XPtFmthTeOK$HC{Z_iL^g+iYo8=cFZmeV*yN}M3VEdW^7X3bAOz~Nk* z+@^<>2=w(^?h{Qt{`X1a>q+5E0DIV2|HzCy9{y!QQ;P(?>q|3_W1Jpz?otBKf7%WR zX1>l{<*Z;t&45aWWF`MN`aT!wWu)M|szvt#B{d>WnmOR05K_FVS`&Sv=3rRMGPnAc zYO>Arz?Y;OyE2r=rZ#heA`y{p2h+gD;t1;daP}mW+Dg>7bhtt-`_4tce*Ej4)XkYB zfE}lX)RREj-)3KuZ$Ww%Zi~FcI8#UH9Xwz>A)bP14#)w;mwEPS94&!PWU|FdxX*}m zOc>nH*l?+xL@{wWDl2NF()ihl!_DQ=qB@ zA2m=SfgjSYgv<&N1j7JN;0*j*Q^hWD$q#|5JxYZ_DQN`F#=Sc%PO0#o{?t8{fi6E% zv5)EI0R+;mSvxm9AU22b3^PO3ag5$QslV6lQa{)}DeFjFGhf$jF1Cr0<#(ht7!A7e zN@VZKUqB!T%2TS$ZzM>4$SOmDgPf`Z-go%Cg>*s5DVtA5ydR?Q#{PTPS6zhCHS4Fi z#%^RNS5BJh6nezeb9e+@6d&IN?ZjrTN&J;jcey z_$mQTc7jeC1_yu8lh}~uX1r~Na9%}5z`smpu}UK4{+{e4pd$l?i? z(%oKNtVF}x%|rT^+k@E>f3O6~+2VVL?)N5i`~2pY+G&&8N0aB1hr|N*7oiRHJU?5l zABsV_f^uFF27~m-H^iI8F~4DRbWD!YeuMzIcABgCoq3fI5;ZQ35{ZNkY5Ewr)0mbR zFU@!{g4RPMCW-}`XC0C4d{IjyeJ|{^z1DvO4j8PPr%X$$4UeTgctZwmMtllAQsErm2O3&s2>;`puoD#Hj+Y_H{zH@izsGqSv*{q_RVWM|SBC)9>ibQ? zm4waALr4W*76I>%H+X{qEBDUtU2aBC`TQi7u&f*@b-C< z;g&CW0dvvQWS0-v(k{N~{6SjwdXjq?=b*AYRT5%3cA{z=M5nWA{Q2j@4Syc;e%@smMAQ_DXMb{H;?r}AT! zFo5&POG-8#?6vf2hQ0F$s?(a4_iQrkvg0kY}+Iv--U% z5$iq_OOq1*kH#aLGZvD=Ap=S+vbApcvUHriwPDiM8@I|o8_bv{?Mv#fW5OmhJW9wn ziFpBjm{yziRU+_nw0y~EDa@8&pezUGB&xz`FiZBb`vV7?4+_F+yyu$Sb`rm0Z^niphgY|T>`rWA(~f6W9?DFuj8F4+lYNoiG#xiR|7!rb{KLbJCP zi3wiqOe^nGPR7jwM^^#W3H52Smcb=X4RCw0mPHZI8Q!6l(CHd7jJl_M5CE3{y}JTyxc2 zunAo?l6;qTwNWMm1`0gw+vUTlR9(cAQ9iS(`Mjor*gbgjl^H@{3TPp%&Fd95@ZHNw zBjYT$eEXyd&t{RQWZDK+?S7wTN^f-C>xZqoelr=sKU!PHuxl6DZZ|8LURw!(D`%+* zv+XfjGskZ%@M#*%S`GE)+&`R6oRgA_R3ACnJ8fG-ES~k8Bc1Dv%@VX#5emaq+6cmt zxWo}3)%T>X-@B>PX3tNo-||Usn*axe;3a3rR`aFC)09q2I{7bYb)ZckxCHsmr|BnR zCSinut+DUmuqdD7iphI7ctc)w4Lsc4V$?gA@{DHQRo`%t*{36=XpOmXW%PReK`K)M zPqaDajeiw3s6`0qVRouU?t=7kL(!AHjDjJX;7sPo6@I5PzT^K3X~&IPC>+x;)fjV9 z_kzWN6VVj+mr1?QVmvGkpMbq_Rn4HPXdkwVu`Yyt^JNhEBMQat3;v*Uo-7C2;S6UT zgxGBC?uGQ<*1&l=KT6dgodC<_6AmlduzBVY2caqh_k<5(GcjEq!%Re|9ISBP z+kp~@KSr;;(OBgu=pZQqjsd!Lgv;4S6D2AeUHt9#4fLHZ$dzIIQ)DX=T0iJ#fv_)I8JTQR+LDG*%Gd4y*UbL z6DC4{A#%6kL$|POJ{dR_j{RnNJZcozUj4=)n_0pgRw7dX%I@^o7;iM;HT;`jGQ<|h zB6zFkyMTh!7V0_@X&dep;eUK{#KeH;<9o%Sy(K!YxEg%ih0JzEjK$g%(AOtkxwd7# zhg}l&mw!54t(^}Q;5!3K!3>j77dKC2lk`8t49hV8pNL^&Bs zh08S|i8@EgThoKL)udfBD}8qmQ*!}Zcmq?WO)^nb%JB>xb9LO|!rQC!js+AqTEu!) zNAZm+<+*8jp2JA|wAxh;X6+&m>ve|js4a|EwWL;@ICj#LbMMG{=}dfkj=~?!etXZY zMapA;Gfw3rYKc+@A`Kv@AmInE{_tO`b%>%mqD^_8T|6PKCk!+F!bvBa71AtVewv+ng*CMzOx9eHp1K>&mEg&fU&440rnr#1^BP)6Qa&s& z#fOel%?Ls0#E~%mdIXhuYO;Z%ZDD{_)kb<3;B%$5nQ`OhO*bhV_g*WYb{V9-4Z&4g zC7yUK2I{X1jM@Cp|5KflWvb~8_^-=Qw!ojJ(MGUn128ZzMU8v+X1kef%y2?4>ifU8 zM`_0^Bn4>N+^v9%RW*_V3Hi$^h$$YHuWYYCISO@?g<^!E13mQst{ynO`A{?v9!Hxu zo2>Nhh-P&5i&?4yIxf$!n>X4o*a+Fx#s;IeDim}>(SlnTa%cCmHz-glf|m2K;Mn?o zOfP-t3ffnY;`6{c?{+>ha4gM$l_i|Vl)0O=82r`=N*M)#4xk1B)?{?e~s5E zGuSeYzyG*;;%oDW?LCyDMu~qW1p=?x0fY9m#3AJ@poxk39h(O+5yu)dUIO%_(#2pJ zU+7bGqRbF(p?P)1x)OW{smdox+EAQwgQ0X{7D>T6D`6e*L}63b2qS)iHZ-pdTPA7U zC41&ert$5V{#^X>wCBv*JO9k810W$I!2M3`e5lOktKvVUn3{2nb-;#qamzE7U!kb_ zlb56gREhsucz(G)QHaf7Yy_76B;t}j2wd-%g~0I(>`2b;YS*LqwhBzmia_aVla%Mh z2Hg)VQZN;vJe=^7Cj-jvfC(q-L@Gb=q2R4B3x)#S*OOpCV zlFk(ErwL0`>y&NB>xiTUD5^t4xcbh-^XnX{tajQ1! zmHMk=1JO{LqL?XYs_HHLE^1AJzwt9_BsRpz8YDzVXY4CiJ0`sp&XMm2N*s|ptuFR? zLOxOyab48+9|olqh{KL?hCd7`SlgMo?1=%`9Hz(6a?a?l=bnz|e{y9BDTm)40fJP; z#rTDQv-qJFA`M{4QHqWYhCKSIj!;gpvhqF!=m^qPgkA4evofkFW!wgV?cANai> z2x%^7-z96vjeT~=@KeO!8)Y-~HgiEWYCHjZ0o(R|x(YSZkJ_e7!j}!7**L zg&g;Ou@3mY8~kP>Ih?kP_2~wQtbNxEMPZN7@=i@15*{XlVd4pd5GJge2E&DbXCMAR zMJ05`-O>k}NGb-o(%gDlAQ>4q@?BD|23ZkHP4zm0i>znva=%!ZEmtwrOJR>MGihfO z%NKHZ2sLCN4_bixc7VC?FFzm?LyQU8w}HPQ>!~zFmum)3DYUrkX4dYk2^v`ut&e5q8Cb-cJ=Hj>4!}RJK1Cm!JEcF2yj}-jD zCTFLt?~MtY&expy@s^8hMO}XDB7q;&Vl=V{^yAzHomP7}f*Cy5c)$%M$C#%<_^2u6Z_3DFMvdLgBvFkuuxLnE%{6)T59T zGA^ol+y`JNJbr!n3MW*U{qnhsFu}aKy8`00UZ<)79^!1pR!G`TNLw1+6AET~ej-22 z=1|LMu0uk^Q@jmyU zjkv}=jDV_fdAPTnxp&MzGYB#}#!5!JbLu1gvd3#@9U=#1ebzUfJm#Q9;84TIU~NNG zg%26sDKgN)GGM^v>DDNn7OQVxroBbU&i&u*-HIaF)dL}~w0?xN|Y=Kdil zB?6zjQICPw6-IhI)rG6++g4_&0HTRnpJP1062j`ihX}9eImQ6qNMr*ER5wY$Sp<`% zO8w|${zDDzW%5_B%>n(P)4#mup1I;yYRG$J&PH0Td7|K7icZ&?*R{c{&bnjcqF%jV+=Nj;)yVjd(PR7Zo9bH zAauaqs%H)`S_WQ{tVt!>xQQvZRM*Ps`e| z);Fcn$%fgD&*u7fJ#2dsH~G}(Yx!48zSC2(uMyF1N*b_(VTOr&uc2|(SR@dCBaIWK zgpmGyEx#khhV*>92H0}xOzFtgV5L$)Bc8c%@_u42j_heiHHbx`c~)<%`M|&)e-Y0@ zh(2Biv-oaLtTOfUjZ!Y-m>Cb4z$K zZf+|i#OIu3ttF?e-~ro-)8087Zo|hnzC+-`Sx(mQ@t;^w7jwzET7OMckJ{#3G79Bo zqWMvBm%Jw3?Is%240M=jQz#FNNZuXqgID9L|CuX706Qvkg0=tu?dWiJX38G7R3U9E z|D3$fxo3{jJlh@&1BJf%UVe0k;=?QrMLPyy5Z*N~6~&dSXyX+kW$LB`C{q|*w<<4- zV8mdA#M~L;iQJ%{il}f(*w3%AhfoVQP^+T^4gu=`6#pTo_|ux#Y6hq`B~y56p~7@? z#9Ewp1m1&u*XTLdnyr!#ADi)*!hnHGxQGP7(P?Cai(ha~)f8;51Rcc_YU;+xP(l3V z!U&roa@?I6vd``yB(bG0*R&rm_F~Nv_}J`aGv8w9A;Tz4z>jrhH_z7q_I9V~0P6Xs z^>Kyb@BpoHads$3{uIOi&D9SxW8KGEbZ/cmdline uses NULL separators + if "\0" in value: + parts = value.split("\0") + value = " ".join(p for p in parts if p) + + return value.strip() + + def __is_missing_command(self, command): + normalized = self.__normalize_value(command).strip() + return normalized == "" or normalized.lower() == "(null)" + + def __parse_nodes(self, value): + node_values = {} + text = self.__normalize_value(value) + if not text: + return node_values + for token in text.split(','): + if ':' not in token: + continue + name, raw_value = token.split(':', 1) + name = name.strip() + if not name.startswith("node"): + continue + try: + node_id = int(name[4:]) + node_values[node_id] = float(raw_value) + except (TypeError, ValueError): + continue + return node_values + + def __matches_process(self, pid, selectors, haystack): + if not selectors: + return True + haystack = self.__normalize_value(haystack) + for selector in selectors: + selector_text = self.__normalize_value(selector) + if re.fullmatch(r"\d+", selector_text): + try: + if int(selector_text) == int(pid): + return True + except (TypeError, ValueError): + continue + continue + if selector_text in haystack: + return True + return False + + def __collect_process_categories(self, inst_id, metric_maps): + category_values = {} + nodes = set() + has_data = False + for label, metric in PROCESS_NUMA_METRICS: + parsed = self.__parse_nodes(metric_maps[metric].get(inst_id, "")) + if parsed: + has_data = True + category_values[label] = parsed + nodes.update(parsed.keys()) + return category_values, nodes, has_data + + def __sum_categories(self, category_values): + node_totals = {} + for values in category_values.values(): + for node_id, value in values.items(): + node_totals[node_id] = node_totals.get(node_id, 0.0) + value + return node_totals + + def __process_rows(self, selectors, system_nodes=None): + rows = [] + nodes = set(system_nodes or []) + selectors_provided = bool(selectors) + requested_pids = set() + for selector in selectors or []: + selector_text = self.__normalize_value(selector) + if re.fullmatch(r"\d+", selector_text): + try: + requested_pids.add(int(selector_text)) + except (TypeError, ValueError): + continue + pid_map = self.repo.current_values("proc.psinfo.pid") or {} + command_map = self.repo.current_values("proc.psinfo.cmd") or {} + psargs_map = self.repo.current_values("proc.psinfo.psargs") or {} + metric_maps = {} + for _, metric in PROCESS_NUMA_METRICS: + metric_maps[metric] = self.repo.current_values(metric) or {} + + # Restrict scanning to processes that are actually present in proc.numa_maps.*. + numa_inst_ids = set() + for values in metric_maps.values(): + try: + numa_inst_ids.update(values.keys()) + except Exception: + continue + + for inst_id, pid in sorted(pid_map.items(), key=lambda item: item[1]): + if inst_id not in numa_inst_ids and int(pid) not in requested_pids: + continue + if ( + self.ignore_pid is not None + and int(pid) == int(self.ignore_pid) + and int(pid) not in requested_pids + ): + continue + command = command_map.get(inst_id, "") + full_command = psargs_map.get(inst_id, command) + if self.__is_missing_command(command): + if int(pid) in requested_pids: + command = "unknown" + full_command = "unknown" + else: + continue + # Constrain matching to the same process set and labels as the + # proc.numa_maps.* instance domains (e.g. `pminfo -f proc.numa_maps.heap`). + match_text = "%s %s" % ( + self.__normalize_value(command), + self.__normalize_cmdline(full_command), + ) + if not self.__matches_process(pid, selectors, match_text): + continue + + category_values, category_nodes, has_data = self.__collect_process_categories( + inst_id, + metric_maps, + ) + if not has_data and not selectors_provided: + continue + if not has_data and self.__is_missing_command(command): + continue + + if category_nodes: + nodes.update(category_nodes) + node_totals = self.__sum_categories(category_values) + rows.append((pid, command, node_totals, category_values)) + return rows, sorted(nodes) + + def __node_blocks_for_table(self, nodes, width, pid_col_width): + num_col_width = 15 + sep = " " + col_width = len(sep) + num_col_width + + width = self.__resize(width) + max_cols = int((width - pid_col_width) / col_width) + max_cols = max(1, max_cols) + max_nodes_no_total = max_cols + + # If we can only fit one numeric column, there is no room to display + # any node column together with a Total column. Emit the nodes first + # (one per block), then a final Total-only block. + if max_cols <= 1: + for node_id in nodes: + yield [node_id], False + yield [], True + return + + max_nodes_with_total = max_cols - 1 + + if len(nodes) <= max_nodes_with_total: + yield nodes, True + return + + done = 0 + while len(nodes) - done > max_nodes_with_total: + remaining = len(nodes) - done + chunk_size = min(max_nodes_no_total, remaining) + + # Avoid consuming all remaining nodes in a non-total block (which + # would otherwise suppress the Total column entirely when nodes + # exactly fill the display width). + if remaining <= max_nodes_no_total and remaining - chunk_size == 0: + chunk_size = max(1, remaining - 1) + + chunk = nodes[done:done + chunk_size] + if not chunk: + break + yield chunk, False + done += chunk_size + + yield nodes[done:], True + + def __print_process_table(self, rows, nodes, width): + print("Per-node process memory usage (in MBs)") + pid_col_width = max( + 16, + max( + len("%s (%s)" % (pid, self.__normalize_value(command))) + for pid, command, _, _ in rows + ), + ) + num_col_width = 15 + sep = " " + + node_totals_all = dict((node_id, 0.0) for node_id in nodes) + row_totals = {} + grand_total = 0.0 + for pid, _, per_node, _ in rows: + total = 0.0 + for node_id in nodes: + value = per_node.get(node_id, 0.0) + node_totals_all[node_id] += value + total += value + row_totals[pid] = total + grand_total += total + + for chunk, include_total in self.__node_blocks_for_table(nodes, width, pid_col_width): + header = "%-*s" % (pid_col_width, "PID") + for node_id in chunk: + header += "%s%*s" % (sep, num_col_width, "Node %d" % node_id) + if include_total: + header += "%s%*s" % (sep, num_col_width, "Total") + print(header) + + line = "-" * pid_col_width + for _ in range(len(chunk) + (1 if include_total else 0)): + line += "%s%s" % (sep, "-" * num_col_width) + print(line) + + for pid, command, per_node, _ in rows: + label = "%s (%s)" % (pid, self.__normalize_value(command)) + row = "%-*s" % (pid_col_width, label) + for node_id in chunk: + row += "%s%*.2f" % (sep, num_col_width, per_node.get(node_id, 0.0)) + if include_total: + row += "%s%*.2f" % (sep, num_col_width, row_totals.get(pid, 0.0)) + print(row) + + print(line) + total_row = "%-*s" % (pid_col_width, "Total") + for node_id in chunk: + total_row += "%s%*.2f" % (sep, num_col_width, node_totals_all.get(node_id, 0.0)) + if include_total: + total_row += "%s%*.2f" % (sep, num_col_width, grand_total) + print(total_row) + print() + + def __node_blocks(self, nodes, width): + label_width = 16 + num_col_width = 15 + sep = " " + col_width = len(sep) + num_col_width + + width = self.__resize(width) + max_cols = int((width - label_width) / col_width) + max_cols = max(1, max_cols) + max_nodes_no_total = max_cols + + # If we can only fit one numeric column, there is no room to display + # any node column together with a Total column. Emit the nodes first + # (one per block), then a final Total-only block. + if max_cols <= 1: + for node_id in nodes: + yield [node_id], False + yield [], True + return + + max_nodes_with_total = max_cols - 1 + + if len(nodes) <= max_nodes_with_total: + yield nodes, True + return + + done = 0 + while len(nodes) - done > max_nodes_with_total: + remaining = len(nodes) - done + chunk_size = min(max_nodes_no_total, remaining) + + # Avoid consuming all remaining nodes in a non-total block (which + # would otherwise suppress the Total column entirely when nodes + # exactly fill the display width). + if remaining <= max_nodes_no_total and remaining - chunk_size == 0: + chunk_size = max(1, remaining - 1) + + chunk = nodes[done:done + chunk_size] + if not chunk: + break + yield chunk, False + done += chunk_size + + yield nodes[done:], True + + def __print_process_detail(self, row, nodes, width): + pid, command, _, categories = row + print("Per-node process memory usage (in MBs) for PID %s (%s)" % + (pid, self.__normalize_value(command))) + label_width = 16 + num_col_width = 15 + sep = " " + + if not nodes: + nodes = [0] + + category_totals = {} + node_totals = dict((node_id, 0.0) for node_id in nodes) + all_total = 0.0 + for label, _ in PROCESS_NUMA_METRICS: + values = categories.get(label, {}) + total = 0.0 + for node_id in nodes: + value = values.get(node_id, 0.0) + total += value + node_totals[node_id] += value + category_totals[label] = total + all_total += total + + for chunk, include_total in self.__node_blocks(nodes, width): + header = "%-*s" % (label_width, "") + for node_id in chunk: + header += "%s%*s" % (sep, num_col_width, "Node %d" % node_id) + if include_total: + header += "%s%*s" % (sep, num_col_width, "Total") + print(header) + + header_line = " " * label_width + for _ in range(len(chunk) + (1 if include_total else 0)): + header_line += "%s%s" % (sep, "-" * num_col_width) + print(header_line) + + for label, _ in PROCESS_NUMA_METRICS: + row = "%-*s" % (label_width, label) + values = categories.get(label, {}) + for node_id in chunk: + row += "%s%*.2f" % (sep, num_col_width, values.get(node_id, 0.0)) + if include_total: + row += "%s%*.2f" % (sep, num_col_width, category_totals.get(label, 0.0)) + print(row) + + line = "-" * label_width + for _ in range(len(chunk) + (1 if include_total else 0)): + line += "%s%s" % (sep, "-" * num_col_width) + print(line) + + total_row = "%-*s" % (label_width, "Total") + for node_id in chunk: + total_row += "%s%*.2f" % (sep, num_col_width, node_totals.get(node_id, 0.0)) + if include_total: + total_row += "%s%*.2f" % (sep, num_col_width, all_total) + print(total_row) + print() + + def print_processes(self, selectors, system_nodes=None, width=0): + rows, nodes = self.__process_rows(selectors, system_nodes=system_nodes) + if not rows: + if selectors: + print("No matching processes with NUMA maps data.") + else: + print("No processes with NUMA maps data.") + print() + return + if not nodes: + nodes = [0] + selector_texts = [self.__normalize_value(s).strip() for s in (selectors or [])] + selectors_are_pids = bool(selector_texts) and all( + re.fullmatch(r"\d+", text) for text in selector_texts + ) + if selectors_are_pids: + requested = [] + for text in selector_texts: + try: + requested.append(int(text)) + except (TypeError, ValueError): + continue + + rows_by_pid = {} + for pid, command, per_node, categories in rows: + try: + rows_by_pid[int(pid)] = (pid, command, per_node, categories) + except (TypeError, ValueError): + continue + + if len(requested) == 1: + pid = requested[0] + found = rows_by_pid.get(pid) + if found is None: + print("No matching process with NUMA maps data for PID %s." % pid) + print() + return + self.__print_process_detail(found, nodes, width) + return + + selected_rows = [] + for pid in requested: + found = rows_by_pid.get(pid) + if found is None: + print("No matching process with NUMA maps data for PID %s." % pid) + print() + continue + row_pid, command, per_node, categories = found + selected_rows.append((row_pid, command, per_node, categories)) + if selected_rows: + self.__print_process_table(selected_rows, nodes, width) + return + + single_selector = len(selectors or []) == 1 + if single_selector and len(rows) == 1: + self.__print_process_detail(rows[0], nodes, width) + return + + self.__print_process_table(rows, nodes, width) + class NumaStatOption(pmapi.pmOptions): context = None timefmt = "%m/%d/%Y %H:%M:%S" width = 0 mem_out = False numa_out = False + process_out = False + process_filters = [] def override(self,opt): """ Override standard PCP options to match numastat(1) """ - if opt == 'n': + if opt in ('n', 'p'): return True return False def __init__(self): pmapi.pmOptions.__init__(self) - self.pmSetShortOptions("w:mV?:n") + self.width = 0 + self.mem_out = False + self.numa_out = False + self.process_out = False + self.process_filters = [] + self.pmSetShortOptions("w:mV?np") self.pmSetOptionCallback(self.extraOptions) self.pmSetOverrideCallback(self.override) self.pmSetLongOptionHeader("Numastat options") @@ -215,6 +677,7 @@ def __init__(self): # Map long options to our non-conflicting short letters self.pmSetLongOption("meminfo", 0, 'm', "", "show meminfo-like system-wide memory usage") self.pmSetLongOption("numastat", 0, 'n', "", "show the numastat statistics info") + self.pmSetLongOption("process", 0, 'p', "", "show per-process NUMA memory usage") self.pmSetLongOptionVersion() self.pmSetLongOptionHelp() @@ -225,6 +688,8 @@ def extraOptions(self, opt, optarg, index): self.mem_out = True elif opt == "n": self.numa_out = True + elif opt == "p": + self.process_out = True elif opt == "V": pass else: @@ -232,7 +697,7 @@ def extraOptions(self, opt, optarg, index): return True def checkoptions(self): - if (not self.mem_out) and (not self.numa_out) and (self.width == 0): + if (not self.mem_out) and (not self.numa_out) and (not self.process_out): self.numa_out = True if self.width < 0: return False @@ -284,6 +749,33 @@ def __discover_nodes(self, group, name): nodes.sort(key=lambda t: t[0]) return nodes + def __discover_nodes_all(self, group, name): + # Build list of nodes from instances (instance id, instance name) + nodes = [] + try: + for ent in group[name].netValues: + inst_id = ent[0].inst + inst_name = ent[1] # usually "node0", "node1", ... + nodes.append((inst_id, inst_name)) + except Exception: + pass + nodes.sort(key=lambda t: t[0]) + return nodes + + def __node_ids(self, nodes): + node_ids = [] + for inst_id, inst_name in nodes or []: + match = re.match(r"node(\d+)$", str(inst_name)) + if match: + node_ids.append(int(match.group(1))) + continue + try: + node_ids.append(int(inst_id)) + except (TypeError, ValueError): + continue + node_ids = sorted(set(node_ids)) + return node_ids or None + def report(self, manager): # Print in a stable order group = manager["sys_info"] @@ -296,17 +788,54 @@ def report(self, manager): output_numa = ( self.options.numa_out - or (not self.options.mem_out and not self.options.numa_out) ) output_mem = self.options.mem_out - group = manager["numastat"] - nodes = self.__discover_nodes(group, "mem.numa.util.total") - timestamp = self.__get_timestamp(group) + output_process = self.options.process_out + + if output_mem or output_numa: + group = manager["numastat"] + timestamp_group = group + elif output_process: + group = manager["process_numa"] + timestamp_group = group + else: + return + + timestamp = self.__get_timestamp(timestamp_group) print("%-20s : %s"%("Timestamp", timestamp)) if output_mem: + nodes = self.__discover_nodes(group, "mem.numa.util.total") NUMAStat(group).print_mem(self.options.width, nodes, "meminfo") if output_numa: + nodes = self.__discover_nodes(group, "mem.numa.util.total") NUMAStat(group).print_numa(self.options.width, nodes, "numastat") + if output_process: + ignore_pid = None + if ( + NumaStatOption.context is not PM_CONTEXT_ARCHIVE + and not self.options.pmGetOptionHosts() + ): + ignore_pid = os.getpid() + system_nodes = None + try: + system_nodes = self.__node_ids( + self.__discover_nodes(manager["sys_info"], "hinv.node.online") + ) + except Exception: + system_nodes = None + if system_nodes is None: + try: + system_nodes = self.__node_ids( + self.__discover_nodes_all(manager["sys_info"], "mem.numa.alloc.hit") + ) + except Exception: + system_nodes = None + + ProcessNUMAStat(manager["process_numa"], ignore_pid).print_processes( + self.options.process_filters, + system_nodes=system_nodes, + width=self.options.width, + ) if ( NumaStatOption.context is not PM_CONTEXT_ARCHIVE @@ -323,13 +852,37 @@ def report(self, manager): raise pmapi.pmUsageErr() NumaStatOption.context = mngr.type - missing = mngr.checkMissingMetrics(ALL_METRICS) + opts.process_filters = opts.pmGetOperands() + if opts.process_filters and not opts.process_out: + print("Process selectors require -p/--process option") + raise pmapi.pmUsageErr() + if not opts.process_filters and opts.process_out: + print("Provide pid or process name for -p/--process option") + raise pmapi.pmUsageErr() + + required_metrics = list(SYS_METRICS) + if opts.mem_out or opts.numa_out: + required_metrics.extend(ALL_METRICS) + if opts.process_out: + required_metrics.extend(PROCESS_METRICS) + required_metrics = list(dict.fromkeys(required_metrics)) + + missing = mngr.checkMissingMetrics(required_metrics) if missing is not None: sys.stderr.write('Error: not all required metrics are available\nMissing: %s\n' % (missing)) sys.exit(1) - mngr["numastat"] = ALL_METRICS - mngr["sys_info"] = SYS_METRICS + sys_info_metrics = list(SYS_METRICS) + if mngr.checkMissingMetrics(["hinv.node.online"]) is None: + sys_info_metrics.append("hinv.node.online") + if mngr.checkMissingMetrics(["mem.numa.alloc.hit"]) is None: + sys_info_metrics.append("mem.numa.alloc.hit") + + if opts.mem_out or opts.numa_out: + mngr["numastat"] = ALL_METRICS + if opts.process_out: + mngr["process_numa"] = PROCESS_METRICS + mngr["sys_info"] = sys_info_metrics mngr.printer = NumaStatReport(opts) sts = mngr.run() sys.exit(sts) diff --git a/src/pmdas/linux_proc/clusters.h b/src/pmdas/linux_proc/clusters.h index 45a4f4d885f..624fe1fba63 100644 --- a/src/pmdas/linux_proc/clusters.h +++ b/src/pmdas/linux_proc/clusters.h @@ -74,8 +74,9 @@ #define CLUSTER_HOTPROC_PID_FDINFO 78 /* /proc//fdinfo */ #define CLUSTER_PID_DELAYACCT 79 /* libnl (netlink) stats */ #define CLUSTER_HOTPROC_PID_DELAYACCT 80 /* libnl (netlink) stats */ +#define CLUSTER_PID_NUMA_MAPS 81 /* /proc//numa_maps */ #define MIN_CLUSTER 8 /* first cluster number we use here */ -#define MAX_CLUSTER 81 /* one more than highest cluster number used */ +#define MAX_CLUSTER 82 /* one more than highest cluster number used */ #endif /* _CLUSTERS_H */ diff --git a/src/pmdas/linux_proc/help b/src/pmdas/linux_proc/help index 79824bbc9e2..b1cfdfcfe78 100644 --- a/src/pmdas/linux_proc/help +++ b/src/pmdas/linux_proc/help @@ -75,6 +75,19 @@ kernel threads @ proc.runq.kernel number of kernel threads Instantaneous number of processes with virtual size of zero (kernel threads) +@ proc.numa_maps.hugepage per-node hugepage mapped memory in MB (/proc//numa_maps) +Hugepage map values are reported as comma-separated node/value pairs, e.g. +node0:0.00,node1:4.00, where each value is in megabytes. +@ proc.numa_maps.heap per-node heap mapped memory in MB (/proc//numa_maps) +Heap map values are reported as comma-separated node/value pairs, e.g. +node0:0.00,node1:4.00, where each value is in megabytes. +@ proc.numa_maps.stack per-node stack mapped memory in MB (/proc//numa_maps) +Stack map values are reported as comma-separated node/value pairs, e.g. +node0:0.00,node1:4.00, where each value is in megabytes. +@ proc.numa_maps.private per-node private mapped memory in MB (/proc//numa_maps) +Private map values are reported as comma-separated node/value pairs, e.g. +node0:0.00,node1:4.00, where each value is in megabytes. + @ proc.control.all.threads process indom includes threads If set to one, the process instance domain as reported by pmdaproc contains all threads as well as the processes that started them. @@ -591,4 +604,3 @@ of accounting information: 0 inactive (no information available) 1 system (system level accounting from whatever file accton(8) is using) 2 private (accounting records from $PCP_VAR_DIR/pmcd/pacct) - diff --git a/src/pmdas/linux_proc/indom.h b/src/pmdas/linux_proc/indom.h index abe2596ab2e..c5c00a67929 100644 --- a/src/pmdas/linux_proc/indom.h +++ b/src/pmdas/linux_proc/indom.h @@ -62,6 +62,7 @@ extern FILE *proc_statsfile(const char *, char *, int); /* Generic globals setup during PMDA startup */ extern size_t _pm_system_pagesize; +extern size_t _pm_system_hugepagesize; extern long _pm_hertz; /* diff --git a/src/pmdas/linux_proc/pmda.c b/src/pmdas/linux_proc/pmda.c index 2ca676f4b0b..b8cc860ebfb 100644 --- a/src/pmdas/linux_proc/pmda.c +++ b/src/pmdas/linux_proc/pmda.c @@ -66,6 +66,7 @@ static int autogroup = -1; /* =1 autogroup enabled */ static unsigned int threads; /* control.all.threads */ static char * cgroups; /* control.all.cgroups */ size_t _pm_system_pagesize; +size_t _pm_system_hugepagesize; long _pm_hertz; /* @@ -1404,6 +1405,23 @@ static pmdaMetric metrictab[] = { { NULL, { PMDA_PMID(CLUSTER_PID_FDINFO,12), PM_TYPE_U64, PROC_INDOM, PM_SEM_INSTANT, PMDA_PMUNITS(1,0,0,PM_SPACE_KBYTE,0,0)}}, +/* +* numa_maps cluster +*/ + +/* proc.numa_maps.hugepage */ + { NULL, { PMDA_PMID(CLUSTER_PID_NUMA_MAPS,0), PM_TYPE_STRING, PROC_INDOM, + PM_SEM_INSTANT, PMDA_PMUNITS(0,0,0,0,0,0)}}, +/* proc.numa_maps.heap */ + { NULL, { PMDA_PMID(CLUSTER_PID_NUMA_MAPS,1), PM_TYPE_STRING, PROC_INDOM, + PM_SEM_INSTANT, PMDA_PMUNITS(0,0,0,0,0,0)}}, +/* proc.numa_maps.stack */ + { NULL, { PMDA_PMID(CLUSTER_PID_NUMA_MAPS,2), PM_TYPE_STRING, PROC_INDOM, + PM_SEM_INSTANT, PMDA_PMUNITS(0,0,0,0,0,0)}}, +/* proc.numa_maps.private */ + { NULL, { PMDA_PMID(CLUSTER_PID_NUMA_MAPS,3), PM_TYPE_STRING, PROC_INDOM, + PM_SEM_INSTANT, PMDA_PMUNITS(0,0,0,0,0,0)}}, + }; pmInDom @@ -3569,6 +3587,34 @@ proc_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom) return PM_ERR_PMID; } break; + case CLUSTER_PID_NUMA_MAPS: + if (!have_access) + return PM_ERR_PERMISSION; + if ((entry = fetch_proc_pid_numa_maps(inst, active_proc_pid, &sts)) == NULL) + return sts; + if (!(entry->success & PROC_PID_FLAG_NUMA_MAPS)) + return 0; + + switch(item) { + case 0: /* proc.numa_maps.hugepage */ + atom->cp = proc_strings_lookup(entry->numa_maps.huge_id); + break; + + case 1: /* proc.numa_maps.heap */ + atom->cp = proc_strings_lookup(entry->numa_maps.heap_id); + break; + + case 2: /* proc.numa_maps.stack */ + atom->cp = proc_strings_lookup(entry->numa_maps.stack_id); + break; + + case 3: /* proc.numa_maps.private */ + atom->cp = proc_strings_lookup(entry->numa_maps.private_id); + break; + default: /* unknown cluster */ + return PM_ERR_PMID; + } + break; default: /* unknown cluster */ return PM_ERR_PMID; } @@ -3931,6 +3977,25 @@ proc_gidname_lookup(int gid) return ""; } +static size_t +proc_hugepagesize(void) +{ + unsigned long huge_page_size_kb = 0; + char buf[128]; + FILE *fs; + + if ((fs = fopen("/proc/meminfo", "r")) == NULL) + return 0; + + while (fgets(buf, sizeof(buf), fs)) { + if (sscanf(buf, "Hugepagesize: %lu kB", &huge_page_size_kb) == 1) + break; + } + fclose(fs); + + return huge_page_size_kb * 1024; +} + /* * Initialise the agent (both daemon and DSO). */ @@ -3952,6 +4017,10 @@ proc_init(pmdaInterface *dp) _pm_system_pagesize = atoi(envpath); else _pm_system_pagesize = getpagesize(); + if ((envpath = getenv("PROC_HUGEPAGESIZE")) != NULL) + _pm_system_hugepagesize = atoi(envpath); + else + _pm_system_hugepagesize = proc_hugepagesize(); if ((envpath = getenv("PROC_STATSPATH")) != NULL) proc_statspath = envpath; if ((envpath = getenv("PROC_THREADS")) != NULL) diff --git a/src/pmdas/linux_proc/pmdaproc.1 b/src/pmdas/linux_proc/pmdaproc.1 index b817d9740dc..1c6f281c8df 100644 --- a/src/pmdas/linux_proc/pmdaproc.1 +++ b/src/pmdas/linux_proc/pmdaproc.1 @@ -35,6 +35,10 @@ The PMDA exports metrics that measure the memory, processor and other resource use of each process, as well as summary information collated across all of the running processes. +This includes per-process NUMA placement summaries from +.I /proc//numa_maps +via the +.BR proc.numa_maps.*\ metrics. The PMDA uses credentials passed from the .BR PMAPI (3) monitoring tool identifying the user requesting the information, diff --git a/src/pmdas/linux_proc/proc_pid.c b/src/pmdas/linux_proc/proc_pid.c index 5f347ec0ed6..2efb2ff29e1 100644 --- a/src/pmdas/linux_proc/proc_pid.c +++ b/src/pmdas/linux_proc/proc_pid.c @@ -2561,3 +2561,271 @@ fetch_proc_pid_fdinfo(int id, proc_pid_t *proc_pid, int *sts) return (*sts < 0) ? NULL : ep; } + +#define PROCESS_HUGE_INDEX 0 +#define PROCESS_HEAP_INDEX 1 +#define PROCESS_STACK_INDEX 2 +#define PROCESS_PRIVATE_INDEX 3 +#define PROCESS_CATEGORY_COUNT 4 + +#define MEGABYTE (1024.0 * 1024.0) + +static const char *process_mem_tokens[] = { + "huge", + "heap", + "stack", +}; + +typedef struct { + char *s; + size_t len; + size_t cap; +} strbuf_t; + +typedef struct { + int node; + double values[PROCESS_CATEGORY_COUNT]; +} numa_node_totals_t; + +static int +append_numa_maps_node(strbuf_t *b, int node_num, double value_mb) +{ + char tmp[64]; + char *newptr; + size_t needed, newcap; + int n; + + n = pmsprintf(tmp, sizeof(tmp), "node%d:%.2f,", node_num, value_mb); + if (n < 0 || n >= (int)sizeof(tmp)) + return -E2BIG; + + if (b->s == NULL) { + b->cap = 128; + b->s = (char *)malloc(b->cap); + if (b->s == NULL) + return -ENOMEM; + b->len = 0; + b->s[0] = '\0'; + } + + needed = b->len + (size_t)n + 1; + if (needed > b->cap) { + newcap = b->cap; + while (newcap < needed) + newcap *= 2; + + newptr = (char *)realloc(b->s, newcap); + if (newptr == NULL) + return -ENOMEM; + + b->s = newptr; + b->cap = newcap; + } + + memcpy(b->s + b->len, tmp, (size_t)n); + b->len += (size_t)n; + b->s[b->len] = '\0'; + return 0; +} + +static int +find_or_add_numa_node(numa_node_totals_t **nodes, int *node_count, int node) +{ + numa_node_totals_t *new_nodes; + int i; + + for (i = 0; i < *node_count; i++) { + if ((*nodes)[i].node == node) + return i; + } + + new_nodes = (numa_node_totals_t *)realloc(*nodes, + (*node_count + 1) * sizeof(*new_nodes)); + if (new_nodes == NULL) + return -ENOMEM; + + *nodes = new_nodes; + (*nodes)[*node_count].node = node; + memset((*nodes)[*node_count].values, 0, sizeof((*nodes)[*node_count].values)); + (*node_count)++; + return *node_count - 1; +} + +static int +compare_numa_node_totals(const void *a, const void *b) +{ + const numa_node_totals_t *node_a = (const numa_node_totals_t *)a; + const numa_node_totals_t *node_b = (const numa_node_totals_t *)b; + + return node_a->node - node_b->node; +} + +static int +numa_maps_category(const char *line) +{ + char *copy, *tok, *saveptr = NULL; + int i; + + if ((copy = strdup(line)) == NULL) + return PROCESS_PRIVATE_INDEX; + + tok = strtok_r(copy, " \t", &saveptr); + while (tok != NULL) { + for (i = PROCESS_HUGE_INDEX; i <= PROCESS_STACK_INDEX; i++) { + if (strcmp(tok, process_mem_tokens[i]) == 0) { + free(copy); + return i; + } + } + tok = strtok_r(NULL, " \t", &saveptr); + } + free(copy); + return PROCESS_PRIVATE_INDEX; +} + +static int +parse_proc_numa_maps(proc_pid_entry_t *ep, size_t buflen, char *buf) +{ + strbuf_t huge = {0}, heap = {0}, stack = {0}, priv = {0}; + numa_node_totals_t *nodes = NULL; + double page_size_bytes, huge_page_size_bytes; + int node_count = 0; + int sts = 0; + char *cur = buf; + char *end; + + if (buf == NULL || buflen == 0) + return 0; + /* + * Ensure the proc buffer is NUL-terminated so the string routines below + * cannot read past the end. read_proc_entry() allocates len+1 bytes and + * uses buflen (len) for the bytes-read value passed here. + */ + buf[buflen] = '\0'; + end = buf + buflen; + + page_size_bytes = (double)_pm_system_pagesize; + if (page_size_bytes <= 0.0) + page_size_bytes = 4096.0; + + huge_page_size_bytes = (double)_pm_system_hugepagesize; + if (huge_page_size_bytes <= 0.0) + huge_page_size_bytes = page_size_bytes; + + while (cur < end && *cur) { + char *nl = memchr(cur, '\n', (size_t)(end - cur)); + char *tok, *saveptr = NULL; + int category; + + if (nl != NULL) + *nl = '\0'; + + category = numa_maps_category(cur); + tok = strtok_r(cur, " \t", &saveptr); + while (tok != NULL) { + int node, index; + double pages, bytes; + + if (tok[0] == 'N' && sscanf(tok, "N%d=%lf", &node, &pages) == 2) { + index = find_or_add_numa_node(&nodes, &node_count, node); + if (index < 0) { + sts = index; + goto cleanup; + } + + if (category == PROCESS_HUGE_INDEX) + bytes = pages * huge_page_size_bytes; + else + bytes = pages * page_size_bytes; + + nodes[index].values[category] += bytes / MEGABYTE; + } + tok = strtok_r(NULL, " \t", &saveptr); + } + + if (nl == NULL) + break; + *nl = '\n'; + cur = nl + 1; + } + + if (node_count > 1) + qsort(nodes, node_count, sizeof(*nodes), compare_numa_node_totals); + + for (int i = 0; i < node_count; i++) { + sts = append_numa_maps_node(&huge, nodes[i].node, + nodes[i].values[PROCESS_HUGE_INDEX]); + if (sts < 0) + goto cleanup; + sts = append_numa_maps_node(&heap, nodes[i].node, + nodes[i].values[PROCESS_HEAP_INDEX]); + if (sts < 0) + goto cleanup; + sts = append_numa_maps_node(&stack, nodes[i].node, + nodes[i].values[PROCESS_STACK_INDEX]); + if (sts < 0) + goto cleanup; + sts = append_numa_maps_node(&priv, nodes[i].node, + nodes[i].values[PROCESS_PRIVATE_INDEX]); + if (sts < 0) + goto cleanup; + } + + if (huge.s != NULL) + ep->numa_maps.huge_id = proc_strings_insert(huge.s); + if (heap.s != NULL) + ep->numa_maps.heap_id = proc_strings_insert(heap.s); + if (stack.s != NULL) + ep->numa_maps.stack_id = proc_strings_insert(stack.s); + if (priv.s != NULL) + ep->numa_maps.private_id = proc_strings_insert(priv.s); + +cleanup: + free(nodes); + free(huge.s); + free(heap.s); + free(stack.s); + free(priv.s); + return sts; +} + +static int +refresh_proc_pid_numa_maps(proc_pid_entry_t *ep) +{ + int fd, sts; + + if (ep->success & PROC_PID_FLAG_NUMA_MAPS) + return 0; + if ((fd = proc_open("numa_maps", ep)) < 0) + return maperr(); + ep->numa_maps.huge_id = -1; + ep->numa_maps.heap_id = -1; + ep->numa_maps.stack_id = -1; + ep->numa_maps.private_id = -1; + if ((sts = read_proc_entry(fd, &procbuflen, &procbuf)) >= 0) { + sts = parse_proc_numa_maps(ep, procbuflen, procbuf); + if (sts >= 0) + ep->success |= PROC_PID_FLAG_NUMA_MAPS; + } + close(fd); + return sts; +} + +/* + * fetch data from /proc//numa_maps entries for pid + */ +proc_pid_entry_t * +fetch_proc_pid_numa_maps(int id, proc_pid_t *proc_pid, int *sts) +{ + proc_pid_entry_t *ep = proc_pid_entry_lookup(id, proc_pid); + + *sts = 0; + if (!ep) + return NULL; + + if (!(ep->fetched & PROC_PID_FLAG_NUMA_MAPS)) { + *sts = refresh_proc_pid_numa_maps(ep); + ep->fetched |= PROC_PID_FLAG_NUMA_MAPS; + } + return (*sts < 0) ? NULL : ep; +} diff --git a/src/pmdas/linux_proc/proc_pid.h b/src/pmdas/linux_proc/proc_pid.h index d8af689b3a8..112cc358df4 100644 --- a/src/pmdas/linux_proc/proc_pid.h +++ b/src/pmdas/linux_proc/proc_pid.h @@ -203,6 +203,16 @@ typedef struct { uint64_t locked; } proc_pid_smaps_t; +/* + * metrics in /proc//numa_maps + */ +typedef struct { + int huge_id; + int heap_id; + int stack_id; + int private_id; +} proc_pid_numa_maps_t; + /* * metrics in /proc//fdinfo/ */ @@ -247,6 +257,7 @@ enum { PROC_PID_FLAG_AUTOGROUP = 1<<16, PROC_PID_FLAG_FDINFO = 1<<17, PROC_PID_FLAG_DELAYACCT = 1<<18, + PROC_PID_FLAG_NUMA_MAPS = 1<<19, }; typedef struct { @@ -281,6 +292,9 @@ typedef struct { /* /proc//smaps_rollup cluster */ proc_pid_smaps_t smaps; + /* /proc//numa_maps cluster */ + proc_pid_numa_maps_t numa_maps; + /* /proc//maps cluster */ size_t maps_buflen; @@ -375,6 +389,9 @@ extern proc_pid_entry_t *fetch_proc_pid_status(int, proc_pid_t *, int *); /* fetch a proc//smaps_rollup entry for pid */ extern proc_pid_entry_t *fetch_proc_pid_smaps(int, proc_pid_t *, int *); +/* fetch a proc//numa_maps entry for pid */ +extern proc_pid_entry_t *fetch_proc_pid_numa_maps(int, proc_pid_t *, int *); + /* fetch a proc//maps entry for pid */ extern proc_pid_entry_t *fetch_proc_pid_maps(int, proc_pid_t *, int *); diff --git a/src/pmdas/linux_proc/root_proc b/src/pmdas/linux_proc/root_proc index a7008308975..d80915e9a91 100644 --- a/src/pmdas/linux_proc/root_proc +++ b/src/pmdas/linux_proc/root_proc @@ -455,6 +455,14 @@ proc { smaps PROC:*:* autogroup PROC:*:* control + numa_maps +} + +proc.numa_maps { + hugepage PROC:81:0 + heap PROC:81:1 + stack PROC:81:2 + private PROC:81:3 } hotproc { From 2fcce9f7f557f3383222e9c6d17c1f5739858fdb Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Tue, 17 Mar 2026 06:59:24 +1100 Subject: [PATCH 02/31] src/pmcd/pmdaproc.sh: fix check for gmake in _install() On vm39 (x86_64 RHEL 8.10) Makepkgs or rpmbuild (I'm assuming, without digging) decided to set $MAKE to gmake, not /some/bin/gmake path. This left $PCP_MAKE_PROG in /etc/pcp.conf with the value gmake and we promptly failed to install the simple PMDA with (the not so helpful) ... Install: Arrgh, PCP devel environment required to install this PMDA Rework the tests in _install() to 1. use which(1) if the [ -f ... ] fails 2. break out the two conditions (the $PCP_MAKE_PROG one and the test for $PCP_INC_DIR/pmda.h) that can lead to this error and report what part of the "PCP devel environment" is apparently not right --- src/pmcd/pmdaproc.sh | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/pmcd/pmdaproc.sh b/src/pmcd/pmdaproc.sh index d55f2284b0c..72748a56f7c 100644 --- a/src/pmcd/pmdaproc.sh +++ b/src/pmcd/pmdaproc.sh @@ -1099,9 +1099,23 @@ _install() # $PCP_MAKE_PROG may contain command line args ... executable # is first word # - if [ ! -f "`echo $PCP_MAKE_PROG | sed -e 's/ .*//'`" -o ! -f "$PCP_INC_DIR/pmda.h" ] + __make="`echo $PCP_MAKE_PROG | sed -e 's/ .*//'`" + if [ ! -f "$__make" ] then - echo "$prog: Arrgh, PCP devel environment required to install this PMDA" + # not a full path? see if it can be found via $PATH + # + if ! which "$__make" >/dev/null 2>&1 + then + echo "$prog: Error: \$PCP_MAKE_PROG ($PCP_MAKE_PROG) not available" + echo "... PCP developer environment required to install this PMDA" + status=1 + exit + fi + fi + if [ ! -f "$PCP_INC_DIR/pmda.h" ] + then + echo "$prog: Error: pmda.h not found in \$PCP_INC_DIR ($PCP_INC_DIR)" + echo "... PCP developer environment required to install this PMDA" status=1 exit fi From 69032ebd7260ed96bbaeca945ddb9f5ff75b0396 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 22:33:55 +0000 Subject: [PATCH 03/31] build(deps): bump docker/metadata-action from 5 to 6 Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5 to 6. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v5...v6) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ghcr.yml | 4 ++-- .github/workflows/quay.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ghcr.yml b/.github/workflows/ghcr.yml index ad7b315739d..6631cc92fd7 100644 --- a/.github/workflows/ghcr.yml +++ b/.github/workflows/ghcr.yml @@ -33,14 +33,14 @@ jobs: - name: Extract tags and labels for base image id: meta_base - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE }} tags: type=raw,value=latest,enable={{is_default_branch}} - name: Extract tags and labels for archive image id: meta_archive - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.REGISTRY }}/${{ env.ARCHIVE_IMAGE }} tags: type=raw,value=latest,enable={{is_default_branch}} diff --git a/.github/workflows/quay.yml b/.github/workflows/quay.yml index 5986f854541..20962aa0f09 100644 --- a/.github/workflows/quay.yml +++ b/.github/workflows/quay.yml @@ -33,14 +33,14 @@ jobs: - name: Extract tags and labels for base image id: meta_base - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.REGISTRY }}/${{ env.BASE_IMAGE }} tags: type=raw,value=latest,enable={{is_default_branch}} - name: Extract tags and labels for archive image id: meta_archive - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.REGISTRY }}/${{ env.ARCHIVE_IMAGE }} tags: type=raw,value=latest,enable={{is_default_branch}} From e4f965553ecc9034aa71b3013b8e28c909ba3b51 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:03:18 +0000 Subject: [PATCH 04/31] test: add integration test for network.all.* aggregate metrics Defines expected metrics before implementation (TDD). Closes #2532. --- src/pmdas/darwin/test/test-network-all.txt | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/pmdas/darwin/test/test-network-all.txt diff --git a/src/pmdas/darwin/test/test-network-all.txt b/src/pmdas/darwin/test/test-network-all.txt new file mode 100644 index 00000000000..9d0d8db6e4b --- /dev/null +++ b/src/pmdas/darwin/test/test-network-all.txt @@ -0,0 +1,41 @@ +# Network aggregate metrics test (network.all.*) +# These metrics sum across all network interfaces + +# Inbound aggregate metrics +desc network.all.in.bytes +fetch network.all.in.bytes + +desc network.all.in.packets +fetch network.all.in.packets + +desc network.all.in.errors +fetch network.all.in.errors + +desc network.all.in.drops +fetch network.all.in.drops + +# Outbound aggregate metrics +desc network.all.out.bytes +fetch network.all.out.bytes + +desc network.all.out.packets +fetch network.all.out.packets + +desc network.all.out.errors +fetch network.all.out.errors + +desc network.all.out.drops +fetch network.all.out.drops + +# Total aggregate metrics (in + out) +desc network.all.total.bytes +fetch network.all.total.bytes + +desc network.all.total.packets +fetch network.all.total.packets + +desc network.all.total.errors +fetch network.all.total.errors + +desc network.all.total.drops +fetch network.all.total.drops From de4154ff4c5a13db4c5c25f3f2c9a5634c299770 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:03:36 +0000 Subject: [PATCH 05/31] Add CLUSTER_NETWORK_ALL enum for aggregate network metrics --- src/pmdas/darwin/darwin.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pmdas/darwin/darwin.h b/src/pmdas/darwin/darwin.h index bd5743de482..d0bcf757706 100644 --- a/src/pmdas/darwin/darwin.h +++ b/src/pmdas/darwin/darwin.h @@ -50,6 +50,7 @@ enum { CLUSTER_IPV6, /* 23 = ipv6 protocol statistics */ CLUSTER_APFS, /* 24 = apfs statistics */ CLUSTER_THERMAL, /* 25 = thermal/temperature monitoring */ + CLUSTER_NETWORK_ALL, /* 26 = aggregate network statistics */ NUM_CLUSTERS /* total number of clusters */ }; From 27e2455f7aef6f1b13d04a2e8e1790eccf42bbf5 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:04:02 +0000 Subject: [PATCH 06/31] Add net_all_t struct for aggregate network statistics --- src/pmdas/darwin/network.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/pmdas/darwin/network.h b/src/pmdas/darwin/network.h index fdcb2c11fc4..288744bae68 100644 --- a/src/pmdas/darwin/network.h +++ b/src/pmdas/darwin/network.h @@ -51,9 +51,25 @@ typedef struct netstats { ifacestat_t *interfaces; /* space for highwater number of interfaces */ } netstats_t; +/* + * Aggregate network statistics across all interfaces. + * Mirrors Linux PMDA's network.all.* metrics. + */ +typedef struct net_all { + __uint64_t in_bytes; + __uint64_t in_packets; + __uint64_t in_errors; + __uint64_t in_drops; + __uint64_t out_bytes; + __uint64_t out_packets; + __uint64_t out_errors; +} net_all_t; + typedef struct nfsstats { struct nfsclntstats client; struct nfsrvstats server; } nfsstats_t; extern int fetch_network(unsigned int, unsigned int, pmAtomValue *); +extern void refresh_network_all(net_all_t *, struct netstats *); +extern int fetch_network_all(unsigned int, pmAtomValue *); From 53b51a03330720cba9df06e2b3baf804b767d220 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:04:27 +0000 Subject: [PATCH 07/31] Implement network.all.* aggregation and fetch logic Sum per-interface counters for bytes/packets/errors/drops. Note: out.drops always zero as macOS only tracks input drops. --- src/pmdas/darwin/network.c | 71 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/pmdas/darwin/network.c b/src/pmdas/darwin/network.c index 04f0c899ac0..df57c4d4269 100644 --- a/src/pmdas/darwin/network.c +++ b/src/pmdas/darwin/network.c @@ -153,6 +153,77 @@ refresh_network(struct netstats *stats, pmdaIndom *indom) return status; } +/* + * Compute aggregate network statistics by summing across all interfaces. + * Mirrors Linux PMDA's network.all.* metrics (CLUSTER_NET_ALL). + */ +void +refresh_network_all(net_all_t *all, struct netstats *stats) +{ + int i; + + memset(all, 0, sizeof(net_all_t)); + for (i = 0; i < stats->highwater; i++) { + all->in_bytes += stats->interfaces[i].ibytes; + all->in_packets += stats->interfaces[i].ipackets; + all->in_errors += stats->interfaces[i].ierrors; + all->in_drops += stats->interfaces[i].iqdrops; + all->out_bytes += stats->interfaces[i].obytes; + all->out_packets += stats->interfaces[i].opackets; + all->out_errors += stats->interfaces[i].oerrors; + } +} + +int +fetch_network_all(unsigned int item, pmAtomValue *atom) +{ + extern net_all_t mach_net_all; + extern int mach_net_error; + + if (mach_net_error) + return mach_net_error; + + switch (item) { + case 0: /* network.all.in.bytes */ + atom->ull = mach_net_all.in_bytes; + return 1; + case 1: /* network.all.in.packets */ + atom->ull = mach_net_all.in_packets; + return 1; + case 2: /* network.all.in.errors */ + atom->ull = mach_net_all.in_errors; + return 1; + case 3: /* network.all.in.drops */ + atom->ull = mach_net_all.in_drops; + return 1; + case 4: /* network.all.out.bytes */ + atom->ull = mach_net_all.out_bytes; + return 1; + case 5: /* network.all.out.packets */ + atom->ull = mach_net_all.out_packets; + return 1; + case 6: /* network.all.out.errors */ + atom->ull = mach_net_all.out_errors; + return 1; + case 7: /* network.all.out.drops */ + atom->ull = 0; /* macOS does not track output drops */ + return 1; + case 8: /* network.all.total.bytes */ + atom->ull = mach_net_all.in_bytes + mach_net_all.out_bytes; + return 1; + case 9: /* network.all.total.packets */ + atom->ull = mach_net_all.in_packets + mach_net_all.out_packets; + return 1; + case 10: /* network.all.total.errors */ + atom->ull = mach_net_all.in_errors + mach_net_all.out_errors; + return 1; + case 11: /* network.all.total.drops */ + atom->ull = mach_net_all.in_drops; /* input drops only on macOS */ + return 1; + } + return PM_ERR_PMID; +} + int fetch_network(unsigned int item, unsigned int inst, pmAtomValue *atom) { From d56f0840f004b3fe358601f62f863a1df0146130 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:05:05 +0000 Subject: [PATCH 08/31] Wire network.all.* cluster into PMDA refresh and fetch dispatch --- src/pmdas/darwin/pmda.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pmdas/darwin/pmda.c b/src/pmdas/darwin/pmda.c index 30f54ef66ff..000ea0abc79 100644 --- a/src/pmdas/darwin/pmda.c +++ b/src/pmdas/darwin/pmda.c @@ -101,6 +101,7 @@ extern int refresh_uptime(unsigned int *); int mach_net_error = 0; struct netstats mach_net = { 0 }; +net_all_t mach_net_all = { 0 }; extern int refresh_network(struct netstats *, pmdaIndom *); extern void init_network(void); @@ -213,6 +214,11 @@ darwin_refresh(int *need_refresh) mach_uptime_error = refresh_uptime(&mach_uptime); if (need_refresh[CLUSTER_NETWORK]) mach_net_error = refresh_network(&mach_net, &indomtab[NETWORK_INDOM]); + if (need_refresh[CLUSTER_NETWORK_ALL]) { + if (need_refresh[CLUSTER_NETWORK] == 0) + mach_net_error = refresh_network(&mach_net, &indomtab[NETWORK_INDOM]); + refresh_network_all(&mach_net_all, &mach_net); + } if (need_refresh[CLUSTER_NFS]) mach_nfs_error = refresh_nfs(&mach_nfs); if (need_refresh[CLUSTER_VFS]) @@ -284,6 +290,7 @@ darwin_fetchCallBack(pmdaMetric *mdesc, unsigned int inst, pmAtomValue *atom) case CLUSTER_DISK: return fetch_disk(item, inst, atom); case CLUSTER_CPU: return fetch_cpu(item, inst, atom); case CLUSTER_NETWORK: return fetch_network(item, inst, atom); + case CLUSTER_NETWORK_ALL: return fetch_network_all(item, atom); case CLUSTER_NFS: return fetch_nfs(item, inst, atom); case CLUSTER_VFS: return fetch_vfs(item, atom); case CLUSTER_UDP: return fetch_udp(item, atom); From 21066e63db72c375fc0ffbb0538a3f0523f34c6b Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:05:31 +0000 Subject: [PATCH 09/31] Register 12 network.all.* metrics in metric table --- src/pmdas/darwin/metrics.c | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/pmdas/darwin/metrics.c b/src/pmdas/darwin/metrics.c index 59354990449..79b70acccb0 100644 --- a/src/pmdas/darwin/metrics.c +++ b/src/pmdas/darwin/metrics.c @@ -538,6 +538,55 @@ pmdaMetric metrictab[] = { { PMDA_PMID(CLUSTER_NETWORK,93), PM_TYPE_U64, NETWORK_INDOM, PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.in.bytes */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,0), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) }, }, +/* network.all.in.packets */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,1), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.in.errors */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,2), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.in.drops */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,3), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.out.bytes */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,4), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) }, }, +/* network.all.out.packets */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,5), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.out.errors */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,6), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.out.drops */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,7), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.total.bytes */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,8), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(1,0,0,PM_SPACE_BYTE,0,0) }, }, +/* network.all.total.packets */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,9), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.total.errors */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,10), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, +/* network.all.total.drops */ + { NULL, + { PMDA_PMID(CLUSTER_NETWORK_ALL,11), PM_TYPE_U64, PM_INDOM_NULL, + PM_SEM_COUNTER, PMDA_PMUNITS(0,0,1,0,0,PM_COUNT_ONE) }, }, + /* nfs3.client.calls */ { NULL, { PMDA_PMID(CLUSTER_NFS,94), PM_TYPE_U64, PM_INDOM_NULL, From 8302dabe7bad6d1f626ac05f827356f57fbf2316 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:05:58 +0000 Subject: [PATCH 10/31] Add network.all.* PMNS namespace entries --- src/pmdas/darwin/pmns | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/pmdas/darwin/pmns b/src/pmdas/darwin/pmns index 8eb0d4a78cd..fae7c1a7e72 100644 --- a/src/pmdas/darwin/pmns +++ b/src/pmdas/darwin/pmns @@ -215,6 +215,7 @@ disk.apfs.volume { network { interface + all udp icmp ipv6 @@ -255,6 +256,33 @@ network.interface.total { mcasts DARWIN:10:93 } +network.all { + in + out + total +} + +network.all.in { + bytes DARWIN:26:0 + packets DARWIN:26:1 + errors DARWIN:26:2 + drops DARWIN:26:3 +} + +network.all.out { + bytes DARWIN:26:4 + packets DARWIN:26:5 + errors DARWIN:26:6 + drops DARWIN:26:7 +} + +network.all.total { + bytes DARWIN:26:8 + packets DARWIN:26:9 + errors DARWIN:26:10 + drops DARWIN:26:11 +} + network.udp { indatagrams DARWIN:13:142 outdatagrams DARWIN:13:143 From 2612b852c4a57c5b891d27f445af5b661d32d33e Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2026 23:06:33 +0000 Subject: [PATCH 11/31] Add help text for network.all.* aggregate metrics --- src/pmdas/darwin/help | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/pmdas/darwin/help b/src/pmdas/darwin/help index 35514067afe..7ce397f2a6b 100644 --- a/src/pmdas/darwin/help +++ b/src/pmdas/darwin/help @@ -301,6 +301,42 @@ boot time (subject to counter wrap), summed over all disk devices. @ network.interface.total.drops total network connections dropped @ network.interface.total.mcasts total network multicasts +@ network.all.in.bytes total network receive bytes across all interfaces +Sum of network.interface.in.bytes across all network interfaces. + +@ network.all.in.packets total network receive packets across all interfaces +Sum of network.interface.in.packets across all network interfaces. + +@ network.all.in.errors total network receive errors across all interfaces +Sum of network.interface.in.errors across all network interfaces. + +@ network.all.in.drops total network receive drops across all interfaces +Sum of network.interface.in.drops across all network interfaces. + +@ network.all.out.bytes total network send bytes across all interfaces +Sum of network.interface.out.bytes across all network interfaces. + +@ network.all.out.packets total network send packets across all interfaces +Sum of network.interface.out.packets across all network interfaces. + +@ network.all.out.errors total network send errors across all interfaces +Sum of network.interface.out.errors across all network interfaces. + +@ network.all.out.drops total network send drops across all interfaces +Always zero on macOS - output drop tracking is not available. + +@ network.all.total.bytes total network bytes across all interfaces +Sum of network.all.in.bytes and network.all.out.bytes. + +@ network.all.total.packets total network packets across all interfaces +Sum of network.all.in.packets and network.all.out.packets. + +@ network.all.total.errors total network errors across all interfaces +Sum of network.all.in.errors and network.all.out.errors. + +@ network.all.total.drops total network drops across all interfaces +Sum of network.all.in.drops and network.all.out.drops. + @ network.udp.indatagrams total UDP datagrams received Total number of UDP datagrams delivered to UDP users. This is a cumulative counter from boot time. From 0af47cbd752eb22ff2891ce10ff245ff8fe53281 Mon Sep 17 00:00:00 2001 From: Nathan Scott Date: Wed, 18 Mar 2026 14:43:11 +1100 Subject: [PATCH 12/31] qa: remake test 1987 after recent pcp-ps tool changes --- qa/1987.out | 1176 +++++++++++++++++++++++++-------------------------- 1 file changed, 588 insertions(+), 588 deletions(-) diff --git a/qa/1987.out b/qa/1987.out index 58f2dfb372e..eb69bb6a1d4 100644 --- a/qa/1987.out +++ b/qa/1987.out @@ -20055,7 +20055,7 @@ Timestamp PID TTY TIME CMD pcp-ps output : Display the user oriented format Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:31 root 1 0.0 0.0 241324 14332 ? S 00:00:01 06:32:20 systemd +06:20:31 root 1 0.0 0.1 241324 14332 ? S 00:00:01 06:32:20 systemd 06:20:31 root 2 0.0 0.0 0 0 ? S 00:00:00 06:32:20 kthreadd 06:20:31 root 3 0.0 0.0 0 0 ? I 00:00:00 06:32:20 rcu_gp 06:20:31 root 4 0.0 0.0 0 0 ? I 00:00:00 06:32:20 rcu_par_gp @@ -20122,7 +20122,7 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:31 root 125 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/u9:0 06:20:31 root 127 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/1:1-ata_sff 06:20:31 root 135 0.0 0.0 0 0 ? I 00:00:00 06:32:21 charger_manager -06:20:31 root 186 0.1 0.1 0 0 ? I 00:00:00 06:32:21 kworker/3:2-events +06:20:31 root 186 0.1 0.0 0 0 ? I 00:00:00 06:32:21 kworker/3:2-events 06:20:31 root 189 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/1:2-events 06:20:31 root 191 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/1:3-cgroup_d 06:20:31 root 194 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/0:3-cgroup_p @@ -20153,8 +20153,8 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:31 root 486 0.0 0.0 0 0 ? I 00:00:00 06:32:22 xfs-log/dm-0 06:20:31 root 487 0.0 0.0 0 0 ? S 00:00:00 06:32:22 xfsaild/dm-0 06:20:31 root 555 0.0 0.0 0 0 ? I 00:00:00 06:32:22 kworker/2:4-events -06:20:31 root 585 0.0 0.0 89936 12076 ? S 00:00:00 06:32:23 systemd-journal -06:20:31 root 624 0.0 0.0 99808 11036 ? S 00:00:00 06:32:23 systemd-udevd +06:20:31 root 585 0.0 0.08 89936 12076 ? S 00:00:00 06:32:23 systemd-journal +06:20:31 root 624 0.0 0.08 99808 11036 ? S 00:00:00 06:32:23 systemd-udevd 06:20:31 root 655 0.0 0.0 0 0 ? I 00:00:00 06:32:23 cryptd 06:20:31 root 696 0.0 0.0 0 0 ? I 00:00:00 06:32:23 kdmflush 06:20:31 root 751 0.0 0.0 0 0 ? I 00:00:00 06:32:24 xfs-buf/dm-2 @@ -20171,147 +20171,147 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:31 root 762 0.0 0.0 0 0 ? S 00:00:00 06:32:24 xfsaild/dm-2 06:20:31 root 763 0.0 0.0 0 0 ? I 00:00:00 06:32:24 xfs-log/sda1 06:20:31 root 764 0.0 0.0 0 0 ? S 00:00:00 06:32:24 xfsaild/sda1 -06:20:31 rpc 786 0.0 0.0 67240 5496 ? S 00:00:00 06:32:24 rpcbind -06:20:31 root 788 0.0 0.0 130828 2180 ? S 00:00:00 06:32:24 auditd -06:20:31 root 790 0.0 0.0 48648 3308 ? S 00:00:00 06:32:24 sedispatch +06:20:31 rpc 786 0.0 0.04 67240 5496 ? S 00:00:00 06:32:24 rpcbind +06:20:31 root 788 0.0 0.02 130828 2180 ? S 00:00:00 06:32:24 auditd +06:20:31 root 790 0.0 0.02 48648 3308 ? S 00:00:00 06:32:24 sedispatch 06:20:31 root 800 0.0 0.0 0 0 ? I 00:00:00 06:32:24 rpciod 06:20:31 root 801 0.0 0.0 0 0 ? I 00:00:00 06:32:24 xprtiod -06:20:31 root 816 0.0 0.0 7172 1940 ? S 00:00:00 06:32:24 mcelog -06:20:31 dbus 818 0.0 0.0 67416 8124 ? S 00:00:00 06:32:24 dbus-daemon -06:20:31 polkitd 820 0.0 0.0 1759272 26660 ? S 00:00:00 06:32:24 polkitd -06:20:31 root 821 0.0 0.0 124900 4920 ? S 00:00:00 06:32:24 irqbalance -06:20:31 rtkit 826 0.0 0.0 191748 3580 ? S 00:00:00 06:32:24 rtkit-daemon -06:20:31 root 827 0.0 0.0 17540 1568 ? S 00:00:00 06:32:24 alsactl -06:20:31 avahi 829 0.0 0.0 69548 5068 ? S 00:00:00 06:32:24 avahi-daemon -06:20:31 libstorage 830 0.0 0.0 8612 1860 ? S 00:00:00 06:32:24 lsmd -06:20:31 root 834 0.0 0.0 79168 6856 ? S 00:00:00 06:32:24 systemd-machine -06:20:31 root 835 0.0 0.0 545056 18176 ? S 00:00:00 06:32:24 udisksd -06:20:31 root 838 0.0 0.0 183488 11484 ? S 00:00:00 06:32:24 sssd -06:20:31 root 840 0.0 0.0 50696 5992 ? S 00:00:00 06:32:24 smartd -06:20:31 chrony 857 0.0 0.0 140060 4672 ? S 00:00:00 06:32:24 chronyd -06:20:31 root 860 0.0 0.0 15500 2776 ? S 00:00:00 06:32:24 ksmtuned -06:20:31 root 864 0.0 0.0 447888 32184 ? S 00:00:00 06:32:24 vpnagentd +06:20:31 root 816 0.0 0.01 7172 1940 ? S 00:00:00 06:32:24 mcelog +06:20:31 dbus 818 0.0 0.06 67416 8124 ? S 00:00:00 06:32:24 dbus-daemon +06:20:31 polkitd 820 0.0 0.19 1759272 26660 ? S 00:00:00 06:32:24 polkitd +06:20:31 root 821 0.0 0.03 124900 4920 ? S 00:00:00 06:32:24 irqbalance +06:20:31 rtkit 826 0.0 0.03 191748 3580 ? S 00:00:00 06:32:24 rtkit-daemon +06:20:31 root 827 0.0 0.01 17540 1568 ? S 00:00:00 06:32:24 alsactl +06:20:31 avahi 829 0.0 0.04 69548 5068 ? S 00:00:00 06:32:24 avahi-daemon +06:20:31 libstorage 830 0.0 0.01 8612 1860 ? S 00:00:00 06:32:24 lsmd +06:20:31 root 834 0.0 0.05 79168 6856 ? S 00:00:00 06:32:24 systemd-machine +06:20:31 root 835 0.0 0.13 545056 18176 ? S 00:00:00 06:32:24 udisksd +06:20:31 root 838 0.0 0.08 183488 11484 ? S 00:00:00 06:32:24 sssd +06:20:31 root 840 0.0 0.04 50696 5992 ? S 00:00:00 06:32:24 smartd +06:20:31 chrony 857 0.0 0.03 140060 4672 ? S 00:00:00 06:32:24 chronyd +06:20:31 root 860 0.0 0.02 15500 2776 ? S 00:00:00 06:32:24 ksmtuned +06:20:31 root 864 0.0 0.23 447888 32184 ? S 00:00:00 06:32:24 vpnagentd 06:20:31 avahi 868 0.0 0.0 69424 440 ? S 00:00:00 06:32:24 avahi-daemon -06:20:31 root 877 0.0 0.0 192396 12724 ? S 00:00:00 06:32:24 sssd_be -06:20:31 root 884 0.0 0.0 308900 43444 ? S 00:00:00 06:32:24 firewalld -06:20:31 root 885 0.0 0.0 495736 13620 ? S 00:00:00 06:32:24 ModemManager -06:20:31 root 897 0.0 0.0 198164 44248 ? S 00:00:00 06:32:24 sssd_nss -06:20:31 root 941 0.0 0.0 83416 9616 ? S 00:00:00 06:32:24 systemd-logind -06:20:31 root 946 0.0 0.0 311420 9260 ? S 00:00:00 06:32:24 accounts-daemon -06:20:31 root 1106 0.1 0.1 396836 20496 ? S 00:00:00 06:32:24 NetworkManager -06:20:31 root 1117 0.0 0.0 76640 7052 ? S 00:00:00 06:32:24 sshd -06:20:31 root 1119 0.0 0.0 120920 9832 ? S 00:00:00 06:32:24 cupsd -06:20:31 root 1120 0.1 0.4 483856 32504 ? S 00:00:02 06:32:24 tuned -06:20:31 root 1125 0.0 0.0 101792 3792 ? S 00:00:00 06:32:25 gssproxy -06:20:31 root 1150 0.0 0.0 57392 12296 ? S 00:00:00 06:32:25 iscsid -06:20:31 root 1151 0.0 0.0 275056 6756 ? S 00:00:00 06:32:25 rsyslogd +06:20:31 root 877 0.0 0.09 192396 12724 ? S 00:00:00 06:32:24 sssd_be +06:20:31 root 884 0.0 0.31 308900 43444 ? S 00:00:00 06:32:24 firewalld +06:20:31 root 885 0.0 0.1 495736 13620 ? S 00:00:00 06:32:24 ModemManager +06:20:31 root 897 0.0 0.31 198164 44248 ? S 00:00:00 06:32:24 sssd_nss +06:20:31 root 941 0.0 0.07 83416 9616 ? S 00:00:00 06:32:24 systemd-logind +06:20:31 root 946 0.0 0.07 311420 9260 ? S 00:00:00 06:32:24 accounts-daemon +06:20:31 root 1106 0.1 0.14 396836 20496 ? S 00:00:00 06:32:24 NetworkManager +06:20:31 root 1117 0.0 0.05 76640 7052 ? S 00:00:00 06:32:24 sshd +06:20:31 root 1119 0.0 0.07 120920 9832 ? S 00:00:00 06:32:24 cupsd +06:20:31 root 1120 0.1 0.23 483856 32504 ? S 00:00:02 06:32:24 tuned +06:20:31 root 1125 0.0 0.03 101792 3792 ? S 00:00:00 06:32:25 gssproxy +06:20:31 root 1150 0.0 0.09 57392 12296 ? S 00:00:00 06:32:25 iscsid +06:20:31 root 1151 0.0 0.05 275056 6756 ? S 00:00:00 06:32:25 rsyslogd 06:20:31 root 1176 0.0 0.0 0 0 ? I 00:00:00 06:32:25 iscsi_eh -06:20:31 root 1192 0.0 0.0 25860 3564 ? S 00:00:00 06:32:25 crond +06:20:31 root 1192 0.0 0.03 25860 3564 ? S 00:00:00 06:32:25 crond 06:20:31 root 1193 0.0 0.0 0 0 ? I 00:00:00 06:32:25 kworker/0:4-cgroup_p -06:20:31 root 1194 0.0 0.0 26128 2204 ? S 00:00:00 06:32:25 atd -06:20:31 pcp 1624 0.0 0.0 106772 6804 ? S 00:00:00 06:32:25 pmcd -06:20:31 root 1633 0.0 0.0 106416 7076 ? S 00:00:00 06:32:25 pmdaroot -06:20:31 root 1650 0.1 0.1 100884 8848 ? R 00:00:00 06:32:25 pmdaproc -06:20:31 root 1666 0.0 0.0 96904 4716 ? S 00:00:00 06:32:25 pmdaxfs -06:20:31 root 1682 0.1 0.1 99880 8004 ? S 00:00:00 06:32:25 pmdalinux -06:20:31 root 1690 0.0 0.0 162764 20132 ? S 00:00:00 06:32:25 python3 -06:20:31 root 1754 0.0 0.0 96872 4760 ? S 00:00:00 06:32:25 pmdakvm -06:20:31 root 1761 0.0 0.0 104712 7188 ? S 00:00:00 06:32:25 pmdadm -06:20:31 root 1767 0.0 0.0 256256 26980 ? S 00:00:00 06:32:25 python3 -06:20:31 dnsmasq 2407 0.0 0.0 57636 2820 ? S 00:00:00 06:32:26 dnsmasq +06:20:31 root 1194 0.0 0.02 26128 2204 ? S 00:00:00 06:32:25 atd +06:20:31 pcp 1624 0.0 0.05 106772 6804 ? S 00:00:00 06:32:25 pmcd +06:20:31 root 1633 0.0 0.05 106416 7076 ? S 00:00:00 06:32:25 pmdaroot +06:20:31 root 1650 0.1 0.06 100884 8848 ? R 00:00:00 06:32:25 pmdaproc +06:20:31 root 1666 0.0 0.03 96904 4716 ? S 00:00:00 06:32:25 pmdaxfs +06:20:31 root 1682 0.1 0.06 99880 8004 ? S 00:00:00 06:32:25 pmdalinux +06:20:31 root 1690 0.0 0.14 162764 20132 ? S 00:00:00 06:32:25 python3 +06:20:31 root 1754 0.0 0.03 96872 4760 ? S 00:00:00 06:32:25 pmdakvm +06:20:31 root 1761 0.0 0.05 104712 7188 ? S 00:00:00 06:32:25 pmdadm +06:20:31 root 1767 0.0 0.19 256256 26980 ? S 00:00:00 06:32:25 python3 +06:20:31 dnsmasq 2407 0.0 0.02 57636 2820 ? S 00:00:00 06:32:26 dnsmasq 06:20:31 root 2410 0.0 0.0 57540 440 ? S 00:00:00 06:32:26 dnsmasq -06:20:31 pcp 2501 0.0 0.0 97144 7340 ? S 00:00:00 06:32:26 pmie -06:20:31 pcp 2508 0.0 0.0 100728 10692 ? S 00:00:00 06:32:26 pmlogger -06:20:31 pcp 2516 0.0 0.0 94684 4528 ? S 00:00:00 06:32:26 pmpause -06:20:31 pcp 2684 0.0 0.0 94684 4648 ? S 00:00:00 06:32:26 pmpause -06:20:31 root 2937 0.0 0.0 320608 10840 ? S 00:00:00 06:32:27 gdm -06:20:31 root 2953 0.0 0.0 394652 3836 ? S 00:00:00 06:32:27 VBoxService -06:20:31 root 4956 0.0 0.0 321076 9720 ? S 00:00:00 06:32:28 upowerd -06:20:31 geoclue 4964 0.0 0.0 365844 21632 ? S 00:00:00 06:32:28 geoclue -06:20:31 root 4977 0.0 0.0 61332 6668 ? S 00:00:00 06:32:28 wpa_supplicant -06:20:31 root 4978 0.0 0.0 858384 320344 ? S 00:00:05 06:32:28 packagekitd -06:20:31 colord 5059 0.0 0.0 337340 13928 ? S 00:00:00 06:32:29 colord +06:20:31 pcp 2501 0.0 0.05 97144 7340 ? S 00:00:00 06:32:26 pmie +06:20:31 pcp 2508 0.0 0.08 100728 10692 ? S 00:00:00 06:32:26 pmlogger +06:20:31 pcp 2516 0.0 0.03 94684 4528 ? S 00:00:00 06:32:26 pmpause +06:20:31 pcp 2684 0.0 0.03 94684 4648 ? S 00:00:00 06:32:26 pmpause +06:20:31 root 2937 0.0 0.08 320608 10840 ? S 00:00:00 06:32:27 gdm +06:20:31 root 2953 0.0 0.03 394652 3836 ? S 00:00:00 06:32:27 VBoxService +06:20:31 root 4956 0.0 0.07 321076 9720 ? S 00:00:00 06:32:28 upowerd +06:20:31 geoclue 4964 0.0 0.15 365844 21632 ? S 00:00:00 06:32:28 geoclue +06:20:31 root 4977 0.0 0.05 61332 6668 ? S 00:00:00 06:32:28 wpa_supplicant +06:20:31 root 4978 0.0 2.25 858384 320344 ? S 00:00:05 06:32:28 packagekitd +06:20:31 colord 5059 0.0 0.1 337340 13928 ? S 00:00:00 06:32:29 colord 06:20:31 root 5150 0.0 0.0 0 0 ? I 00:00:00 06:32:29 kworker/3:4-cgroup_p -06:20:31 root 5714 0.0 0.0 343044 14780 ? S 00:00:00 06:32:44 gdm-session-wor -06:20:31 root 5729 0.0 0.0 89756 9932 ? S 00:00:00 06:32:44 systemd -06:20:31 root 5731 0.0 0.0 293780 5404 ? S 00:00:00 06:32:44 (sd-pam) -06:20:31 root 5757 0.0 0.0 307228 7604 ? S 00:00:00 06:32:44 gnome-keyring-d -06:20:31 root 5764 0.0 0.0 217836 7936 tty2 S 00:00:00 06:32:44 gdm-wayland-ses -06:20:31 root 5766 0.1 0.1 76556 6756 ? S 00:00:00 06:32:44 dbus-daemon -06:20:31 root 5769 0.0 0.0 658996 17544 tty2 S 00:00:00 06:32:44 gnome-session-b -06:20:31 root 5857 0.2 0.8 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell -06:20:31 root 5901 0.0 0.0 313044 9492 ? S 00:00:00 06:32:44 gvfsd -06:20:31 root 5908 0.0 0.0 445348 6940 ? S 00:00:00 06:32:44 gvfsd-fuse -06:20:31 root 5916 0.0 0.0 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland -06:20:31 root 5927 0.0 0.0 372248 11284 ? S 00:00:00 06:32:44 at-spi-bus-laun -06:20:31 root 5938 0.0 0.0 75708 5604 ? S 00:00:00 06:32:44 dbus-daemon -06:20:31 root 5945 0.0 0.0 248740 8600 ? S 00:00:00 06:32:44 at-spi2-registr -06:20:31 root 5963 0.0 0.0 453812 13192 tty2 S 00:00:00 06:32:44 ibus-daemon -06:20:31 root 5967 0.0 0.0 302936 10716 tty2 S 00:00:00 06:32:44 ibus-dconf -06:20:31 root 5968 0.0 0.0 293832 9728 ? S 00:00:00 06:32:44 xdg-permission- -06:20:31 root 5970 0.0 0.0 438080 28624 tty2 S 00:00:00 06:32:44 ibus-extension- -06:20:31 root 5976 0.0 0.0 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 -06:20:31 root 5979 0.0 0.0 302804 8716 ? S 00:00:00 06:32:44 ibus-portal -06:20:31 root 5993 0.0 0.0 687060 23708 ? S 00:00:00 06:32:45 gnome-shell-cal -06:20:31 root 5999 0.0 0.0 688112 30968 ? S 00:00:00 06:32:45 evolution-sourc -06:20:31 root 6005 0.0 0.0 836252 36364 ? S 00:00:00 06:32:45 goa-daemon -06:20:31 root 6014 0.0 0.0 475680 10940 ? S 00:00:00 06:32:45 gvfs-udisks2-vo -06:20:31 root 6023 0.0 0.0 300728 7848 ? S 00:00:00 06:32:45 gvfs-mtp-volume -06:20:31 root 6030 0.0 0.0 313432 10400 ? S 00:00:00 06:32:45 gvfs-gphoto2-vo -06:20:31 root 6034 0.0 0.0 442592 15728 ? S 00:00:00 06:32:45 goa-identity-se -06:20:31 root 6042 0.0 0.0 298480 8556 ? S 00:00:00 06:32:45 gvfs-goa-volume -06:20:31 root 6050 0.0 0.0 381464 8324 ? S 00:00:00 06:32:45 gvfs-afc-volume -06:20:31 root 6055 0.0 0.1 191080 40088 ? S 00:00:00 06:32:45 sssd_kcm -06:20:31 root 6057 0.0 0.0 612768 26200 tty2 S 00:00:00 06:32:45 gsd-power -06:20:31 root 6058 0.0 0.0 353676 12400 tty2 S 00:00:00 06:32:45 gsd-print-notif -06:20:31 root 6060 0.0 0.0 451604 8260 tty2 S 00:00:00 06:32:45 gsd-rfkill -06:20:31 root 6062 0.0 0.0 299388 7596 tty2 S 00:00:00 06:32:45 gsd-screensaver -06:20:31 root 6064 0.0 0.0 455408 10220 tty2 S 00:00:00 06:32:45 gsd-sharing -06:20:31 root 6072 0.0 0.0 367356 11292 tty2 S 00:00:00 06:32:45 gsd-sound -06:20:31 root 6078 0.0 0.0 524264 25692 tty2 S 00:00:00 06:32:45 gsd-xsettings -06:20:31 root 6082 0.0 0.0 510204 26088 tty2 S 00:00:00 06:32:45 gsd-wacom -06:20:31 root 6085 0.0 0.0 840368 31632 ? S 00:00:00 06:32:45 evolution-calen -06:20:31 root 6087 0.0 0.0 474636 14620 tty2 S 00:00:00 06:32:45 gsd-smartcard -06:20:31 root 6088 0.0 0.0 382140 11108 tty2 S 00:00:00 06:32:45 gsd-account -06:20:31 root 6111 0.0 0.0 301644 8764 tty2 S 00:00:00 06:32:45 gsd-a11y-settin -06:20:31 root 6113 0.0 0.0 229132 10436 tty2 S 00:00:00 06:32:45 ibus-engine-sim -06:20:31 root 6115 0.0 0.0 1172012 13208 ? S 00:00:00 06:32:45 pulseaudio -06:20:31 root 6122 0.0 0.0 373412 24040 tty2 S 00:00:00 06:32:45 gsd-clipboard -06:20:31 root 6126 0.0 0.0 687008 26468 tty2 S 00:00:00 06:32:45 gsd-color -06:20:31 root 6128 0.0 0.0 460056 16560 tty2 S 00:00:00 06:32:45 gsd-datetime -06:20:31 root 6131 0.0 0.0 388720 9964 tty2 S 00:00:00 06:32:45 gsd-housekeepin -06:20:31 root 6132 0.0 0.0 523188 24360 tty2 S 00:00:00 06:32:45 gsd-keyboard -06:20:31 root 6138 0.0 0.0 898984 27208 tty2 S 00:00:00 06:32:45 gsd-media-keys -06:20:31 root 6142 0.0 0.0 301780 10860 tty2 S 00:00:00 06:32:45 gsd-mouse -06:20:31 root 6188 0.0 0.0 1189836 33212 ? S 00:00:00 06:32:45 evolution-calen -06:20:31 root 6216 0.0 0.0 827040 31152 ? S 00:00:00 06:32:45 evolution-addre -06:20:31 root 6217 0.0 0.0 214924 7732 ? S 00:00:00 06:32:45 dconf-service -06:20:31 root 6219 0.0 0.1 770024 50580 ? S 00:00:00 06:32:45 tracker-store -06:20:31 root 6224 0.0 0.0 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software -06:20:31 root 6230 0.0 0.0 301372 9128 tty2 S 00:00:00 06:32:45 gsd-disk-utilit -06:20:31 root 6243 0.0 0.0 1229252 25848 tty2 S 00:00:00 06:32:45 tracker-miner-a -06:20:31 root 6252 0.0 0.0 517804 15540 tty2 S 00:00:00 06:32:45 gsd-printer -06:20:31 root 6254 0.1 0.2 788224 30540 tty2 S 00:00:00 06:32:45 tracker-miner-f +06:20:31 root 5714 0.0 0.1 343044 14780 ? S 00:00:00 06:32:44 gdm-session-wor +06:20:31 root 5729 0.0 0.07 89756 9932 ? S 00:00:00 06:32:44 systemd +06:20:31 root 5731 0.0 0.04 293780 5404 ? S 00:00:00 06:32:44 (sd-pam) +06:20:31 root 5757 0.0 0.05 307228 7604 ? S 00:00:00 06:32:44 gnome-keyring-d +06:20:31 root 5764 0.0 0.06 217836 7936 tty2 S 00:00:00 06:32:44 gdm-wayland-ses +06:20:31 root 5766 0.1 0.05 76556 6756 ? S 00:00:00 06:32:44 dbus-daemon +06:20:31 root 5769 0.0 0.12 658996 17544 tty2 S 00:00:00 06:32:44 gnome-session-b +06:20:31 root 5857 0.2 2.16 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell +06:20:31 root 5901 0.0 0.07 313044 9492 ? S 00:00:00 06:32:44 gvfsd +06:20:31 root 5908 0.0 0.05 445348 6940 ? S 00:00:00 06:32:44 gvfsd-fuse +06:20:31 root 5916 0.0 0.37 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland +06:20:31 root 5927 0.0 0.08 372248 11284 ? S 00:00:00 06:32:44 at-spi-bus-laun +06:20:31 root 5938 0.0 0.04 75708 5604 ? S 00:00:00 06:32:44 dbus-daemon +06:20:31 root 5945 0.0 0.06 248740 8600 ? S 00:00:00 06:32:44 at-spi2-registr +06:20:31 root 5963 0.0 0.09 453812 13192 tty2 S 00:00:00 06:32:44 ibus-daemon +06:20:31 root 5967 0.0 0.08 302936 10716 tty2 S 00:00:00 06:32:44 ibus-dconf +06:20:31 root 5968 0.0 0.07 293832 9728 ? S 00:00:00 06:32:44 xdg-permission- +06:20:31 root 5970 0.0 0.2 438080 28624 tty2 S 00:00:00 06:32:44 ibus-extension- +06:20:31 root 5976 0.0 0.45 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 +06:20:31 root 5979 0.0 0.06 302804 8716 ? S 00:00:00 06:32:44 ibus-portal +06:20:31 root 5993 0.0 0.17 687060 23708 ? S 00:00:00 06:32:45 gnome-shell-cal +06:20:31 root 5999 0.0 0.22 688112 30968 ? S 00:00:00 06:32:45 evolution-sourc +06:20:31 root 6005 0.0 0.26 836252 36364 ? S 00:00:00 06:32:45 goa-daemon +06:20:31 root 6014 0.0 0.08 475680 10940 ? S 00:00:00 06:32:45 gvfs-udisks2-vo +06:20:31 root 6023 0.0 0.06 300728 7848 ? S 00:00:00 06:32:45 gvfs-mtp-volume +06:20:31 root 6030 0.0 0.07 313432 10400 ? S 00:00:00 06:32:45 gvfs-gphoto2-vo +06:20:31 root 6034 0.0 0.11 442592 15728 ? S 00:00:00 06:32:45 goa-identity-se +06:20:31 root 6042 0.0 0.06 298480 8556 ? S 00:00:00 06:32:45 gvfs-goa-volume +06:20:31 root 6050 0.0 0.06 381464 8324 ? S 00:00:00 06:32:45 gvfs-afc-volume +06:20:31 root 6055 0.0 0.28 191080 40088 ? S 00:00:00 06:32:45 sssd_kcm +06:20:31 root 6057 0.0 0.18 612768 26200 tty2 S 00:00:00 06:32:45 gsd-power +06:20:31 root 6058 0.0 0.09 353676 12400 tty2 S 00:00:00 06:32:45 gsd-print-notif +06:20:31 root 6060 0.0 0.06 451604 8260 tty2 S 00:00:00 06:32:45 gsd-rfkill +06:20:31 root 6062 0.0 0.05 299388 7596 tty2 S 00:00:00 06:32:45 gsd-screensaver +06:20:31 root 6064 0.0 0.07 455408 10220 tty2 S 00:00:00 06:32:45 gsd-sharing +06:20:31 root 6072 0.0 0.08 367356 11292 tty2 S 00:00:00 06:32:45 gsd-sound +06:20:31 root 6078 0.0 0.18 524264 25692 tty2 S 00:00:00 06:32:45 gsd-xsettings +06:20:31 root 6082 0.0 0.18 510204 26088 tty2 S 00:00:00 06:32:45 gsd-wacom +06:20:31 root 6085 0.0 0.22 840368 31632 ? S 00:00:00 06:32:45 evolution-calen +06:20:31 root 6087 0.0 0.1 474636 14620 tty2 S 00:00:00 06:32:45 gsd-smartcard +06:20:31 root 6088 0.0 0.08 382140 11108 tty2 S 00:00:00 06:32:45 gsd-account +06:20:31 root 6111 0.0 0.06 301644 8764 tty2 S 00:00:00 06:32:45 gsd-a11y-settin +06:20:31 root 6113 0.0 0.07 229132 10436 tty2 S 00:00:00 06:32:45 ibus-engine-sim +06:20:31 root 6115 0.0 0.09 1172012 13208 ? S 00:00:00 06:32:45 pulseaudio +06:20:31 root 6122 0.0 0.17 373412 24040 tty2 S 00:00:00 06:32:45 gsd-clipboard +06:20:31 root 6126 0.0 0.19 687008 26468 tty2 S 00:00:00 06:32:45 gsd-color +06:20:31 root 6128 0.0 0.12 460056 16560 tty2 S 00:00:00 06:32:45 gsd-datetime +06:20:31 root 6131 0.0 0.07 388720 9964 tty2 S 00:00:00 06:32:45 gsd-housekeepin +06:20:31 root 6132 0.0 0.17 523188 24360 tty2 S 00:00:00 06:32:45 gsd-keyboard +06:20:31 root 6138 0.0 0.19 898984 27208 tty2 S 00:00:00 06:32:45 gsd-media-keys +06:20:31 root 6142 0.0 0.08 301780 10860 tty2 S 00:00:00 06:32:45 gsd-mouse +06:20:31 root 6188 0.0 0.23 1189836 33212 ? S 00:00:00 06:32:45 evolution-calen +06:20:31 root 6216 0.0 0.22 827040 31152 ? S 00:00:00 06:32:45 evolution-addre +06:20:31 root 6217 0.0 0.05 214924 7732 ? S 00:00:00 06:32:45 dconf-service +06:20:31 root 6219 0.0 0.36 770024 50580 ? S 00:00:00 06:32:45 tracker-store +06:20:31 root 6224 0.0 1.01 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software +06:20:31 root 6230 0.0 0.06 301372 9128 tty2 S 00:00:00 06:32:45 gsd-disk-utilit +06:20:31 root 6243 0.0 0.18 1229252 25848 tty2 S 00:00:00 06:32:45 tracker-miner-a +06:20:31 root 6252 0.0 0.11 517804 15540 tty2 S 00:00:00 06:32:45 gsd-printer +06:20:31 root 6254 0.1 0.21 788224 30540 tty2 S 00:00:00 06:32:45 tracker-miner-f 06:20:31 root 6288 0.0 0.0 117628 376 ? S 00:00:00 06:32:46 VBoxClient -06:20:31 root 6294 0.0 0.0 1109452 32004 ? S 00:00:00 06:32:46 evolution-addre -06:20:31 root 6297 0.0 0.0 186268 2240 ? S 00:00:00 06:32:46 VBoxClient +06:20:31 root 6294 0.0 0.22 1109452 32004 ? S 00:00:00 06:32:46 evolution-addre +06:20:31 root 6297 0.0 0.02 186268 2240 ? S 00:00:00 06:32:46 VBoxClient 06:20:31 root 6324 0.0 0.0 117628 380 ? S 00:00:00 06:32:46 VBoxClient -06:20:31 root 6325 0.0 0.0 184196 2844 ? S 00:00:00 06:32:46 VBoxClient +06:20:31 root 6325 0.0 0.02 184196 2844 ? S 00:00:00 06:32:46 VBoxClient 06:20:31 root 6334 0.0 0.0 117628 380 ? S 00:00:00 06:32:46 VBoxClient -06:20:31 root 6335 0.1 0.1 250248 2720 ? S 00:00:00 06:32:46 VBoxClient +06:20:31 root 6335 0.1 0.02 250248 2720 ? S 00:00:00 06:32:46 VBoxClient 06:20:31 root 6342 0.0 0.0 117628 380 ? S 00:00:00 06:32:46 VBoxClient -06:20:31 root 6343 0.0 0.0 94116 1252 ? S 00:00:00 06:32:46 VBoxDRMClient -06:20:31 root 6432 0.0 0.0 637144 25848 ? S 00:00:00 06:32:46 fwupd -06:20:31 root 6834 0.0 0.0 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- -06:20:31 root 6839 0.0 0.0 16800 5772 pts/0 S 00:00:00 06:32:55 bash +06:20:31 root 6343 0.0 0.01 94116 1252 ? S 00:00:00 06:32:46 VBoxDRMClient +06:20:31 root 6432 0.0 0.18 637144 25848 ? S 00:00:00 06:32:46 fwupd +06:20:31 root 6834 0.0 0.35 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- +06:20:31 root 6839 0.0 0.04 16800 5772 pts/0 S 00:00:00 06:32:55 bash 06:20:31 root 6941 0.0 0.0 0 0 ? I 00:00:00 06:32:59 kworker/1:4-cgroup_p -06:20:31 root 8571 0.0 0.0 227008 8832 ? S 00:00:00 06:33:50 gvfsd-metadata -06:20:31 root 9308 0.0 0.0 7312 892 ? S 00:00:00 06:37:24 sleep -06:20:31 root 9327 0.0 0.0 12976 3240 pts/0 S 00:00:00 06:37:42 mk.ps -06:20:31 root 9344 0.0 0.0 97072 7052 pts/0 S 00:00:00 06:37:42 pmlogger -06:20:31 root 9349 0.1 0.7 1173832 20680 ? R 00:00:00 06:37:42 tracker-extract +06:20:31 root 8571 0.0 0.06 227008 8832 ? S 00:00:00 06:33:50 gvfsd-metadata +06:20:31 root 9308 0.0 0.01 7312 892 ? S 00:00:00 06:37:24 sleep +06:20:31 root 9327 0.0 0.02 12976 3240 pts/0 S 00:00:00 06:37:42 mk.ps +06:20:31 root 9344 0.0 0.05 97072 7052 pts/0 S 00:00:00 06:37:42 pmlogger +06:20:31 root 9349 0.1 0.15 1173832 20680 ? R 00:00:00 06:37:42 tracker-extract Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:32 root 1 0.0 0.0 241324 14332 ? S 00:00:01 06:32:20 systemd +06:20:32 root 1 0.0 0.1 241324 14332 ? S 00:00:01 06:32:20 systemd 06:20:32 root 2 0.0 0.0 0 0 ? S 00:00:00 06:32:20 kthreadd 06:20:32 root 3 0.0 0.0 0 0 ? I 00:00:00 06:32:20 rcu_gp 06:20:32 root 4 0.0 0.0 0 0 ? I 00:00:00 06:32:20 rcu_par_gp @@ -20378,7 +20378,7 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:32 root 125 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/u9:0 06:20:32 root 127 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/1:1-ata_sff 06:20:32 root 135 0.0 0.0 0 0 ? I 00:00:00 06:32:21 charger_manager -06:20:32 root 186 0.1 0.1 0 0 ? I 00:00:00 06:32:21 kworker/3:2-events +06:20:32 root 186 0.1 0.0 0 0 ? I 00:00:00 06:32:21 kworker/3:2-events 06:20:32 root 189 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/1:2-events 06:20:32 root 191 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/1:3-cgroup_d 06:20:32 root 194 0.0 0.0 0 0 ? I 00:00:00 06:32:21 kworker/0:3-cgroup_p @@ -20409,8 +20409,8 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:32 root 486 0.0 0.0 0 0 ? I 00:00:00 06:32:22 xfs-log/dm-0 06:20:32 root 487 0.0 0.0 0 0 ? S 00:00:00 06:32:22 xfsaild/dm-0 06:20:32 root 555 0.0 0.0 0 0 ? I 00:00:00 06:32:22 kworker/2:4-events -06:20:32 root 585 0.0 0.0 89936 12076 ? S 00:00:00 06:32:23 systemd-journal -06:20:32 root 624 0.0 0.0 99808 11036 ? S 00:00:00 06:32:23 systemd-udevd +06:20:32 root 585 0.0 0.08 89936 12076 ? S 00:00:00 06:32:23 systemd-journal +06:20:32 root 624 0.0 0.08 99808 11036 ? S 00:00:00 06:32:23 systemd-udevd 06:20:32 root 655 0.0 0.0 0 0 ? I 00:00:00 06:32:23 cryptd 06:20:32 root 696 0.0 0.0 0 0 ? I 00:00:00 06:32:23 kdmflush 06:20:32 root 751 0.0 0.0 0 0 ? I 00:00:00 06:32:24 xfs-buf/dm-2 @@ -20427,145 +20427,145 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:32 root 762 0.0 0.0 0 0 ? S 00:00:00 06:32:24 xfsaild/dm-2 06:20:32 root 763 0.0 0.0 0 0 ? I 00:00:00 06:32:24 xfs-log/sda1 06:20:32 root 764 0.0 0.0 0 0 ? S 00:00:00 06:32:24 xfsaild/sda1 -06:20:32 rpc 786 0.0 0.0 67240 5496 ? S 00:00:00 06:32:24 rpcbind -06:20:32 root 788 0.0 0.0 130828 2180 ? S 00:00:00 06:32:24 auditd -06:20:32 root 790 0.0 0.0 48648 3308 ? S 00:00:00 06:32:24 sedispatch +06:20:32 rpc 786 0.0 0.04 67240 5496 ? S 00:00:00 06:32:24 rpcbind +06:20:32 root 788 0.0 0.02 130828 2180 ? S 00:00:00 06:32:24 auditd +06:20:32 root 790 0.0 0.02 48648 3308 ? S 00:00:00 06:32:24 sedispatch 06:20:32 root 800 0.0 0.0 0 0 ? I 00:00:00 06:32:24 rpciod 06:20:32 root 801 0.0 0.0 0 0 ? I 00:00:00 06:32:24 xprtiod -06:20:32 root 816 0.0 0.0 7172 1940 ? S 00:00:00 06:32:24 mcelog -06:20:32 dbus 818 0.0 0.0 67416 8124 ? S 00:00:00 06:32:24 dbus-daemon -06:20:32 polkitd 820 0.0 0.0 1759272 26660 ? S 00:00:00 06:32:24 polkitd -06:20:32 root 821 0.0 0.0 124900 4920 ? S 00:00:00 06:32:24 irqbalance -06:20:32 rtkit 826 0.0 0.0 191748 3580 ? S 00:00:00 06:32:24 rtkit-daemon -06:20:32 root 827 0.0 0.0 17540 1568 ? S 00:00:00 06:32:24 alsactl -06:20:32 avahi 829 0.0 0.0 69548 5068 ? S 00:00:00 06:32:24 avahi-daemon -06:20:32 libstorage 830 0.0 0.0 8612 1860 ? S 00:00:00 06:32:24 lsmd -06:20:32 root 834 0.0 0.0 79168 6856 ? S 00:00:00 06:32:24 systemd-machine -06:20:32 root 835 0.0 0.0 545056 18176 ? S 00:00:00 06:32:24 udisksd -06:20:32 root 838 0.0 0.0 183488 11484 ? S 00:00:00 06:32:24 sssd -06:20:32 root 840 0.0 0.0 50696 5992 ? S 00:00:00 06:32:24 smartd -06:20:32 chrony 857 0.0 0.0 140060 4672 ? S 00:00:00 06:32:24 chronyd -06:20:32 root 860 0.0 0.0 15500 2776 ? S 00:00:00 06:32:24 ksmtuned -06:20:32 root 864 0.0 0.0 447888 32184 ? S 00:00:00 06:32:24 vpnagentd +06:20:32 root 816 0.0 0.01 7172 1940 ? S 00:00:00 06:32:24 mcelog +06:20:32 dbus 818 0.0 0.06 67416 8124 ? S 00:00:00 06:32:24 dbus-daemon +06:20:32 polkitd 820 0.0 0.19 1759272 26660 ? S 00:00:00 06:32:24 polkitd +06:20:32 root 821 0.0 0.03 124900 4920 ? S 00:00:00 06:32:24 irqbalance +06:20:32 rtkit 826 0.0 0.03 191748 3580 ? S 00:00:00 06:32:24 rtkit-daemon +06:20:32 root 827 0.0 0.01 17540 1568 ? S 00:00:00 06:32:24 alsactl +06:20:32 avahi 829 0.0 0.04 69548 5068 ? S 00:00:00 06:32:24 avahi-daemon +06:20:32 libstorage 830 0.0 0.01 8612 1860 ? S 00:00:00 06:32:24 lsmd +06:20:32 root 834 0.0 0.05 79168 6856 ? S 00:00:00 06:32:24 systemd-machine +06:20:32 root 835 0.0 0.13 545056 18176 ? S 00:00:00 06:32:24 udisksd +06:20:32 root 838 0.0 0.08 183488 11484 ? S 00:00:00 06:32:24 sssd +06:20:32 root 840 0.0 0.04 50696 5992 ? S 00:00:00 06:32:24 smartd +06:20:32 chrony 857 0.0 0.03 140060 4672 ? S 00:00:00 06:32:24 chronyd +06:20:32 root 860 0.0 0.02 15500 2776 ? S 00:00:00 06:32:24 ksmtuned +06:20:32 root 864 0.0 0.23 447888 32184 ? S 00:00:00 06:32:24 vpnagentd 06:20:32 avahi 868 0.0 0.0 69424 440 ? S 00:00:00 06:32:24 avahi-daemon -06:20:32 root 877 0.0 0.0 192396 12724 ? S 00:00:00 06:32:24 sssd_be -06:20:32 root 884 0.0 0.0 308900 43444 ? S 00:00:00 06:32:24 firewalld -06:20:32 root 885 0.0 0.0 495736 13620 ? S 00:00:00 06:32:24 ModemManager -06:20:32 root 897 0.0 0.0 198164 44248 ? S 00:00:00 06:32:24 sssd_nss -06:20:32 root 941 0.0 0.0 83416 9616 ? S 00:00:00 06:32:24 systemd-logind -06:20:32 root 946 0.0 0.0 311420 9260 ? S 00:00:00 06:32:24 accounts-daemon -06:20:32 root 1106 0.1 0.1 396836 20496 ? S 00:00:00 06:32:24 NetworkManager -06:20:32 root 1117 0.0 0.0 76640 7052 ? S 00:00:00 06:32:24 sshd -06:20:32 root 1119 0.0 0.0 120920 9832 ? S 00:00:00 06:32:24 cupsd -06:20:32 root 1120 0.1 0.4 483856 32504 ? S 00:00:02 06:32:24 tuned -06:20:32 root 1125 0.0 0.0 101792 3792 ? S 00:00:00 06:32:25 gssproxy -06:20:32 root 1150 0.0 0.0 57392 12296 ? S 00:00:00 06:32:25 iscsid -06:20:32 root 1151 0.0 0.0 275056 6756 ? S 00:00:00 06:32:25 rsyslogd +06:20:32 root 877 0.0 0.09 192396 12724 ? S 00:00:00 06:32:24 sssd_be +06:20:32 root 884 0.0 0.31 308900 43444 ? S 00:00:00 06:32:24 firewalld +06:20:32 root 885 0.0 0.1 495736 13620 ? S 00:00:00 06:32:24 ModemManager +06:20:32 root 897 0.0 0.31 198164 44248 ? S 00:00:00 06:32:24 sssd_nss +06:20:32 root 941 0.0 0.07 83416 9616 ? S 00:00:00 06:32:24 systemd-logind +06:20:32 root 946 0.0 0.07 311420 9260 ? S 00:00:00 06:32:24 accounts-daemon +06:20:32 root 1106 0.1 0.14 396836 20496 ? S 00:00:00 06:32:24 NetworkManager +06:20:32 root 1117 0.0 0.05 76640 7052 ? S 00:00:00 06:32:24 sshd +06:20:32 root 1119 0.0 0.07 120920 9832 ? S 00:00:00 06:32:24 cupsd +06:20:32 root 1120 0.1 0.23 483856 32504 ? S 00:00:02 06:32:24 tuned +06:20:32 root 1125 0.0 0.03 101792 3792 ? S 00:00:00 06:32:25 gssproxy +06:20:32 root 1150 0.0 0.09 57392 12296 ? S 00:00:00 06:32:25 iscsid +06:20:32 root 1151 0.0 0.05 275056 6756 ? S 00:00:00 06:32:25 rsyslogd 06:20:32 root 1176 0.0 0.0 0 0 ? I 00:00:00 06:32:25 iscsi_eh -06:20:32 root 1192 0.0 0.0 25860 3564 ? S 00:00:00 06:32:25 crond +06:20:32 root 1192 0.0 0.03 25860 3564 ? S 00:00:00 06:32:25 crond 06:20:32 root 1193 0.0 0.0 0 0 ? I 00:00:00 06:32:25 kworker/0:4-cgroup_p -06:20:32 root 1194 0.0 0.0 26128 2204 ? S 00:00:00 06:32:25 atd -06:20:32 pcp 1624 0.0 0.0 106772 6804 ? S 00:00:00 06:32:25 pmcd -06:20:32 root 1633 0.0 0.0 106416 7076 ? S 00:00:00 06:32:25 pmdaroot -06:20:32 root 1650 0.1 0.1 100884 8848 ? R 00:00:00 06:32:25 pmdaproc -06:20:32 root 1666 0.0 0.0 96904 4716 ? S 00:00:00 06:32:25 pmdaxfs -06:20:32 root 1682 0.1 0.1 99880 8004 ? S 00:00:00 06:32:25 pmdalinux -06:20:32 root 1690 0.0 0.0 162764 20132 ? S 00:00:00 06:32:25 python3 -06:20:32 root 1754 0.0 0.0 96872 4760 ? S 00:00:00 06:32:25 pmdakvm -06:20:32 root 1761 0.0 0.0 104712 7188 ? S 00:00:00 06:32:25 pmdadm -06:20:32 root 1767 0.0 0.0 256256 26980 ? S 00:00:00 06:32:25 python3 -06:20:32 dnsmasq 2407 0.0 0.0 57636 2820 ? S 00:00:00 06:32:26 dnsmasq +06:20:32 root 1194 0.0 0.02 26128 2204 ? S 00:00:00 06:32:25 atd +06:20:32 pcp 1624 0.0 0.05 106772 6804 ? S 00:00:00 06:32:25 pmcd +06:20:32 root 1633 0.0 0.05 106416 7076 ? S 00:00:00 06:32:25 pmdaroot +06:20:32 root 1650 0.1 0.06 100884 8848 ? R 00:00:00 06:32:25 pmdaproc +06:20:32 root 1666 0.0 0.03 96904 4716 ? S 00:00:00 06:32:25 pmdaxfs +06:20:32 root 1682 0.1 0.06 99880 8004 ? S 00:00:00 06:32:25 pmdalinux +06:20:32 root 1690 0.0 0.14 162764 20132 ? S 00:00:00 06:32:25 python3 +06:20:32 root 1754 0.0 0.03 96872 4760 ? S 00:00:00 06:32:25 pmdakvm +06:20:32 root 1761 0.0 0.05 104712 7188 ? S 00:00:00 06:32:25 pmdadm +06:20:32 root 1767 0.0 0.19 256256 26980 ? S 00:00:00 06:32:25 python3 +06:20:32 dnsmasq 2407 0.0 0.02 57636 2820 ? S 00:00:00 06:32:26 dnsmasq 06:20:32 root 2410 0.0 0.0 57540 440 ? S 00:00:00 06:32:26 dnsmasq -06:20:32 pcp 2501 0.0 0.0 97144 7340 ? S 00:00:00 06:32:26 pmie -06:20:32 pcp 2508 0.0 0.0 100728 10692 ? S 00:00:00 06:32:26 pmlogger -06:20:32 pcp 2516 0.0 0.0 94684 4528 ? S 00:00:00 06:32:26 pmpause -06:20:32 pcp 2684 0.0 0.0 94684 4648 ? S 00:00:00 06:32:26 pmpause -06:20:32 root 2937 0.0 0.0 320608 10840 ? S 00:00:00 06:32:27 gdm -06:20:32 root 2953 0.0 0.0 394652 3836 ? S 00:00:00 06:32:27 VBoxService -06:20:32 root 4956 0.0 0.0 321076 9720 ? S 00:00:00 06:32:28 upowerd -06:20:32 geoclue 4964 0.0 0.0 365844 21632 ? S 00:00:00 06:32:28 geoclue -06:20:32 root 4977 0.0 0.0 61332 6668 ? S 00:00:00 06:32:28 wpa_supplicant -06:20:32 root 4978 0.0 0.0 858384 320344 ? S 00:00:05 06:32:28 packagekitd -06:20:32 colord 5059 0.0 0.0 337340 13928 ? S 00:00:00 06:32:29 colord +06:20:32 pcp 2501 0.0 0.05 97144 7340 ? S 00:00:00 06:32:26 pmie +06:20:32 pcp 2508 0.0 0.08 100728 10692 ? S 00:00:00 06:32:26 pmlogger +06:20:32 pcp 2516 0.0 0.03 94684 4528 ? S 00:00:00 06:32:26 pmpause +06:20:32 pcp 2684 0.0 0.03 94684 4648 ? S 00:00:00 06:32:26 pmpause +06:20:32 root 2937 0.0 0.08 320608 10840 ? S 00:00:00 06:32:27 gdm +06:20:32 root 2953 0.0 0.03 394652 3836 ? S 00:00:00 06:32:27 VBoxService +06:20:32 root 4956 0.0 0.07 321076 9720 ? S 00:00:00 06:32:28 upowerd +06:20:32 geoclue 4964 0.0 0.15 365844 21632 ? S 00:00:00 06:32:28 geoclue +06:20:32 root 4977 0.0 0.05 61332 6668 ? S 00:00:00 06:32:28 wpa_supplicant +06:20:32 root 4978 0.0 2.25 858384 320344 ? S 00:00:05 06:32:28 packagekitd +06:20:32 colord 5059 0.0 0.1 337340 13928 ? S 00:00:00 06:32:29 colord 06:20:32 root 5150 0.0 0.0 0 0 ? I 00:00:00 06:32:29 kworker/3:4-cgroup_p -06:20:32 root 5714 0.0 0.0 343044 14780 ? S 00:00:00 06:32:44 gdm-session-wor -06:20:32 root 5729 0.0 0.0 89756 9932 ? S 00:00:00 06:32:44 systemd -06:20:32 root 5731 0.0 0.0 293780 5404 ? S 00:00:00 06:32:44 (sd-pam) -06:20:32 root 5757 0.0 0.0 307228 7604 ? S 00:00:00 06:32:44 gnome-keyring-d -06:20:32 root 5764 0.0 0.0 217836 7936 tty2 S 00:00:00 06:32:44 gdm-wayland-ses -06:20:32 root 5766 0.1 0.1 76556 6756 ? S 00:00:00 06:32:44 dbus-daemon -06:20:32 root 5769 0.0 0.0 658996 17544 tty2 S 00:00:00 06:32:44 gnome-session-b -06:20:32 root 5857 0.2 0.8 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell -06:20:32 root 5901 0.0 0.0 313044 9492 ? S 00:00:00 06:32:44 gvfsd -06:20:32 root 5908 0.0 0.0 445348 6940 ? S 00:00:00 06:32:44 gvfsd-fuse -06:20:32 root 5916 0.0 0.0 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland -06:20:32 root 5927 0.0 0.0 372248 11284 ? S 00:00:00 06:32:44 at-spi-bus-laun -06:20:32 root 5938 0.0 0.0 75708 5604 ? S 00:00:00 06:32:44 dbus-daemon -06:20:32 root 5945 0.0 0.0 248740 8600 ? S 00:00:00 06:32:44 at-spi2-registr -06:20:32 root 5963 0.0 0.0 453812 13192 tty2 S 00:00:00 06:32:44 ibus-daemon -06:20:32 root 5967 0.0 0.0 302936 10716 tty2 S 00:00:00 06:32:44 ibus-dconf -06:20:32 root 5968 0.0 0.0 293832 9728 ? S 00:00:00 06:32:44 xdg-permission- -06:20:32 root 5970 0.0 0.0 438080 28624 tty2 S 00:00:00 06:32:44 ibus-extension- -06:20:32 root 5976 0.0 0.0 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 -06:20:32 root 5979 0.0 0.0 302804 8716 ? S 00:00:00 06:32:44 ibus-portal -06:20:32 root 5993 0.0 0.0 687060 23708 ? S 00:00:00 06:32:45 gnome-shell-cal -06:20:32 root 5999 0.0 0.0 688112 30968 ? S 00:00:00 06:32:45 evolution-sourc -06:20:32 root 6005 0.0 0.0 836252 36364 ? S 00:00:00 06:32:45 goa-daemon -06:20:32 root 6014 0.0 0.0 475680 10940 ? S 00:00:00 06:32:45 gvfs-udisks2-vo -06:20:32 root 6023 0.0 0.0 300728 7848 ? S 00:00:00 06:32:45 gvfs-mtp-volume -06:20:32 root 6030 0.0 0.0 313432 10400 ? S 00:00:00 06:32:45 gvfs-gphoto2-vo -06:20:32 root 6034 0.0 0.0 442592 15728 ? S 00:00:00 06:32:45 goa-identity-se -06:20:32 root 6042 0.0 0.0 298480 8556 ? S 00:00:00 06:32:45 gvfs-goa-volume -06:20:32 root 6050 0.0 0.0 381464 8324 ? S 00:00:00 06:32:45 gvfs-afc-volume -06:20:32 root 6055 0.0 0.1 191080 40088 ? S 00:00:00 06:32:45 sssd_kcm -06:20:32 root 6057 0.0 0.0 612768 26200 tty2 S 00:00:00 06:32:45 gsd-power -06:20:32 root 6058 0.0 0.0 353676 12400 tty2 S 00:00:00 06:32:45 gsd-print-notif -06:20:32 root 6060 0.0 0.0 451604 8260 tty2 S 00:00:00 06:32:45 gsd-rfkill -06:20:32 root 6062 0.0 0.0 299388 7596 tty2 S 00:00:00 06:32:45 gsd-screensaver -06:20:32 root 6064 0.0 0.0 455408 10220 tty2 S 00:00:00 06:32:45 gsd-sharing -06:20:32 root 6072 0.0 0.0 367356 11292 tty2 S 00:00:00 06:32:45 gsd-sound -06:20:32 root 6078 0.0 0.0 524264 25692 tty2 S 00:00:00 06:32:45 gsd-xsettings -06:20:32 root 6082 0.0 0.0 510204 26088 tty2 S 00:00:00 06:32:45 gsd-wacom -06:20:32 root 6085 0.0 0.0 840368 31632 ? S 00:00:00 06:32:45 evolution-calen -06:20:32 root 6087 0.0 0.0 474636 14620 tty2 S 00:00:00 06:32:45 gsd-smartcard -06:20:32 root 6088 0.0 0.0 382140 11108 tty2 S 00:00:00 06:32:45 gsd-account -06:20:32 root 6111 0.0 0.0 301644 8764 tty2 S 00:00:00 06:32:45 gsd-a11y-settin -06:20:32 root 6113 0.0 0.0 229132 10436 tty2 S 00:00:00 06:32:45 ibus-engine-sim -06:20:32 root 6115 0.0 0.0 1172012 13208 ? S 00:00:00 06:32:45 pulseaudio -06:20:32 root 6122 0.0 0.0 373412 24040 tty2 S 00:00:00 06:32:45 gsd-clipboard -06:20:32 root 6126 0.0 0.0 687008 26468 tty2 S 00:00:00 06:32:45 gsd-color -06:20:32 root 6128 0.0 0.0 460056 16560 tty2 S 00:00:00 06:32:45 gsd-datetime -06:20:32 root 6131 0.0 0.0 388720 9964 tty2 S 00:00:00 06:32:45 gsd-housekeepin -06:20:32 root 6132 0.0 0.0 523188 24360 tty2 S 00:00:00 06:32:45 gsd-keyboard -06:20:32 root 6138 0.0 0.0 898984 27208 tty2 S 00:00:00 06:32:45 gsd-media-keys -06:20:32 root 6142 0.0 0.0 301780 10860 tty2 S 00:00:00 06:32:45 gsd-mouse -06:20:32 root 6188 0.0 0.0 1189836 33212 ? S 00:00:00 06:32:45 evolution-calen -06:20:32 root 6216 0.0 0.0 827040 31152 ? S 00:00:00 06:32:45 evolution-addre -06:20:32 root 6217 0.0 0.0 214924 7732 ? S 00:00:00 06:32:45 dconf-service -06:20:32 root 6219 0.0 0.1 770024 50580 ? S 00:00:00 06:32:45 tracker-store -06:20:32 root 6224 0.0 0.0 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software -06:20:32 root 6230 0.0 0.0 301372 9128 tty2 S 00:00:00 06:32:45 gsd-disk-utilit -06:20:32 root 6243 0.0 0.0 1229252 25848 tty2 S 00:00:00 06:32:45 tracker-miner-a -06:20:32 root 6252 0.0 0.0 517804 15540 tty2 S 00:00:00 06:32:45 gsd-printer -06:20:32 root 6254 0.1 0.2 788224 30540 tty2 S 00:00:00 06:32:45 tracker-miner-f +06:20:32 root 5714 0.0 0.1 343044 14780 ? S 00:00:00 06:32:44 gdm-session-wor +06:20:32 root 5729 0.0 0.07 89756 9932 ? S 00:00:00 06:32:44 systemd +06:20:32 root 5731 0.0 0.04 293780 5404 ? S 00:00:00 06:32:44 (sd-pam) +06:20:32 root 5757 0.0 0.05 307228 7604 ? S 00:00:00 06:32:44 gnome-keyring-d +06:20:32 root 5764 0.0 0.06 217836 7936 tty2 S 00:00:00 06:32:44 gdm-wayland-ses +06:20:32 root 5766 0.1 0.05 76556 6756 ? S 00:00:00 06:32:44 dbus-daemon +06:20:32 root 5769 0.0 0.12 658996 17544 tty2 S 00:00:00 06:32:44 gnome-session-b +06:20:32 root 5857 0.2 2.16 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell +06:20:32 root 5901 0.0 0.07 313044 9492 ? S 00:00:00 06:32:44 gvfsd +06:20:32 root 5908 0.0 0.05 445348 6940 ? S 00:00:00 06:32:44 gvfsd-fuse +06:20:32 root 5916 0.0 0.37 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland +06:20:32 root 5927 0.0 0.08 372248 11284 ? S 00:00:00 06:32:44 at-spi-bus-laun +06:20:32 root 5938 0.0 0.04 75708 5604 ? S 00:00:00 06:32:44 dbus-daemon +06:20:32 root 5945 0.0 0.06 248740 8600 ? S 00:00:00 06:32:44 at-spi2-registr +06:20:32 root 5963 0.0 0.09 453812 13192 tty2 S 00:00:00 06:32:44 ibus-daemon +06:20:32 root 5967 0.0 0.08 302936 10716 tty2 S 00:00:00 06:32:44 ibus-dconf +06:20:32 root 5968 0.0 0.07 293832 9728 ? S 00:00:00 06:32:44 xdg-permission- +06:20:32 root 5970 0.0 0.2 438080 28624 tty2 S 00:00:00 06:32:44 ibus-extension- +06:20:32 root 5976 0.0 0.45 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 +06:20:32 root 5979 0.0 0.06 302804 8716 ? S 00:00:00 06:32:44 ibus-portal +06:20:32 root 5993 0.0 0.17 687060 23708 ? S 00:00:00 06:32:45 gnome-shell-cal +06:20:32 root 5999 0.0 0.22 688112 30968 ? S 00:00:00 06:32:45 evolution-sourc +06:20:32 root 6005 0.0 0.26 836252 36364 ? S 00:00:00 06:32:45 goa-daemon +06:20:32 root 6014 0.0 0.08 475680 10940 ? S 00:00:00 06:32:45 gvfs-udisks2-vo +06:20:32 root 6023 0.0 0.06 300728 7848 ? S 00:00:00 06:32:45 gvfs-mtp-volume +06:20:32 root 6030 0.0 0.07 313432 10400 ? S 00:00:00 06:32:45 gvfs-gphoto2-vo +06:20:32 root 6034 0.0 0.11 442592 15728 ? S 00:00:00 06:32:45 goa-identity-se +06:20:32 root 6042 0.0 0.06 298480 8556 ? S 00:00:00 06:32:45 gvfs-goa-volume +06:20:32 root 6050 0.0 0.06 381464 8324 ? S 00:00:00 06:32:45 gvfs-afc-volume +06:20:32 root 6055 0.0 0.28 191080 40088 ? S 00:00:00 06:32:45 sssd_kcm +06:20:32 root 6057 0.0 0.18 612768 26200 tty2 S 00:00:00 06:32:45 gsd-power +06:20:32 root 6058 0.0 0.09 353676 12400 tty2 S 00:00:00 06:32:45 gsd-print-notif +06:20:32 root 6060 0.0 0.06 451604 8260 tty2 S 00:00:00 06:32:45 gsd-rfkill +06:20:32 root 6062 0.0 0.05 299388 7596 tty2 S 00:00:00 06:32:45 gsd-screensaver +06:20:32 root 6064 0.0 0.07 455408 10220 tty2 S 00:00:00 06:32:45 gsd-sharing +06:20:32 root 6072 0.0 0.08 367356 11292 tty2 S 00:00:00 06:32:45 gsd-sound +06:20:32 root 6078 0.0 0.18 524264 25692 tty2 S 00:00:00 06:32:45 gsd-xsettings +06:20:32 root 6082 0.0 0.18 510204 26088 tty2 S 00:00:00 06:32:45 gsd-wacom +06:20:32 root 6085 0.0 0.22 840368 31632 ? S 00:00:00 06:32:45 evolution-calen +06:20:32 root 6087 0.0 0.1 474636 14620 tty2 S 00:00:00 06:32:45 gsd-smartcard +06:20:32 root 6088 0.0 0.08 382140 11108 tty2 S 00:00:00 06:32:45 gsd-account +06:20:32 root 6111 0.0 0.06 301644 8764 tty2 S 00:00:00 06:32:45 gsd-a11y-settin +06:20:32 root 6113 0.0 0.07 229132 10436 tty2 S 00:00:00 06:32:45 ibus-engine-sim +06:20:32 root 6115 0.0 0.09 1172012 13208 ? S 00:00:00 06:32:45 pulseaudio +06:20:32 root 6122 0.0 0.17 373412 24040 tty2 S 00:00:00 06:32:45 gsd-clipboard +06:20:32 root 6126 0.0 0.19 687008 26468 tty2 S 00:00:00 06:32:45 gsd-color +06:20:32 root 6128 0.0 0.12 460056 16560 tty2 S 00:00:00 06:32:45 gsd-datetime +06:20:32 root 6131 0.0 0.07 388720 9964 tty2 S 00:00:00 06:32:45 gsd-housekeepin +06:20:32 root 6132 0.0 0.17 523188 24360 tty2 S 00:00:00 06:32:45 gsd-keyboard +06:20:32 root 6138 0.0 0.19 898984 27208 tty2 S 00:00:00 06:32:45 gsd-media-keys +06:20:32 root 6142 0.0 0.08 301780 10860 tty2 S 00:00:00 06:32:45 gsd-mouse +06:20:32 root 6188 0.0 0.23 1189836 33212 ? S 00:00:00 06:32:45 evolution-calen +06:20:32 root 6216 0.0 0.22 827040 31152 ? S 00:00:00 06:32:45 evolution-addre +06:20:32 root 6217 0.0 0.05 214924 7732 ? S 00:00:00 06:32:45 dconf-service +06:20:32 root 6219 0.0 0.36 770024 50580 ? S 00:00:00 06:32:45 tracker-store +06:20:32 root 6224 0.0 1.01 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software +06:20:32 root 6230 0.0 0.06 301372 9128 tty2 S 00:00:00 06:32:45 gsd-disk-utilit +06:20:32 root 6243 0.0 0.18 1229252 25848 tty2 S 00:00:00 06:32:45 tracker-miner-a +06:20:32 root 6252 0.0 0.11 517804 15540 tty2 S 00:00:00 06:32:45 gsd-printer +06:20:32 root 6254 0.1 0.21 788224 30540 tty2 S 00:00:00 06:32:45 tracker-miner-f 06:20:32 root 6288 0.0 0.0 117628 376 ? S 00:00:00 06:32:46 VBoxClient -06:20:32 root 6294 0.0 0.0 1109452 32004 ? S 00:00:00 06:32:46 evolution-addre -06:20:32 root 6297 0.0 0.0 186268 2240 ? S 00:00:00 06:32:46 VBoxClient +06:20:32 root 6294 0.0 0.22 1109452 32004 ? S 00:00:00 06:32:46 evolution-addre +06:20:32 root 6297 0.0 0.02 186268 2240 ? S 00:00:00 06:32:46 VBoxClient 06:20:32 root 6324 0.0 0.0 117628 380 ? S 00:00:00 06:32:46 VBoxClient -06:20:32 root 6325 0.0 0.0 184196 2844 ? S 00:00:00 06:32:46 VBoxClient +06:20:32 root 6325 0.0 0.02 184196 2844 ? S 00:00:00 06:32:46 VBoxClient 06:20:32 root 6334 0.0 0.0 117628 380 ? S 00:00:00 06:32:46 VBoxClient -06:20:32 root 6335 0.1 0.1 250248 2720 ? S 00:00:00 06:32:46 VBoxClient +06:20:32 root 6335 0.1 0.02 250248 2720 ? S 00:00:00 06:32:46 VBoxClient 06:20:32 root 6342 0.0 0.0 117628 380 ? S 00:00:00 06:32:46 VBoxClient -06:20:32 root 6343 0.0 0.0 94116 1252 ? S 00:00:00 06:32:46 VBoxDRMClient -06:20:32 root 6432 0.0 0.0 637144 25848 ? S 00:00:00 06:32:46 fwupd -06:20:32 root 6834 0.0 0.0 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- -06:20:32 root 6839 0.0 0.0 16800 5772 pts/0 S 00:00:00 06:32:55 bash +06:20:32 root 6343 0.0 0.01 94116 1252 ? S 00:00:00 06:32:46 VBoxDRMClient +06:20:32 root 6432 0.0 0.18 637144 25848 ? S 00:00:00 06:32:46 fwupd +06:20:32 root 6834 0.0 0.35 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- +06:20:32 root 6839 0.0 0.04 16800 5772 pts/0 S 00:00:00 06:32:55 bash 06:20:32 root 6941 0.0 0.0 0 0 ? I 00:00:00 06:32:59 kworker/1:4-cgroup_p -06:20:32 root 8571 0.0 0.0 227008 8832 ? S 00:00:00 06:33:50 gvfsd-metadata -06:20:32 root 9308 0.0 0.0 7312 892 ? S 00:00:00 06:37:24 sleep -06:20:32 root 9327 0.0 0.0 12976 3240 pts/0 S 00:00:00 06:37:42 mk.ps -06:20:32 root 9344 0.0 0.0 97072 7052 pts/0 S 00:00:00 06:37:42 pmlogger -06:20:32 root 9349 0.1 0.7 1173832 20680 ? R 00:00:00 06:37:42 tracker-extract +06:20:32 root 8571 0.0 0.06 227008 8832 ? S 00:00:00 06:33:50 gvfsd-metadata +06:20:32 root 9308 0.0 0.01 7312 892 ? S 00:00:00 06:37:24 sleep +06:20:32 root 9327 0.0 0.02 12976 3240 pts/0 S 00:00:00 06:37:42 mk.ps +06:20:32 root 9344 0.0 0.05 97072 7052 pts/0 S 00:00:00 06:37:42 pmlogger +06:20:32 root 9349 0.1 0.15 1173832 20680 ? R 00:00:00 06:37:42 tracker-extract pcp-ps output : Display the colum pid,ppid,tty,uname,wchan Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) @@ -21456,7 +21456,7 @@ Timestamp PID PPID TTY TIME CMD pcp-ps output : Display only selected user process Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:31 root 1 0.0 0.0 241324 14332 ? 0 00:00:01 06:32:20 systemd +06:20:31 root 1 0.0 0.1 241324 14332 ? 0 00:00:01 06:32:20 systemd 06:20:31 root 2 0.0 0.0 0 0 ? 0 00:00:00 06:32:20 kthreadd 06:20:31 root 3 0.0 0.0 0 0 ? 2 00:00:00 06:32:20 rcu_gp 06:20:31 root 4 0.0 0.0 0 0 ? 2 00:00:00 06:32:20 rcu_par_gp @@ -21523,7 +21523,7 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:31 root 125 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/u9:0 06:20:31 root 127 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/1:1-ata_sff 06:20:31 root 135 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 charger_manager -06:20:31 root 186 0.1 0.1 0 0 ? 2 00:00:00 06:32:21 kworker/3:2-events +06:20:31 root 186 0.1 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/3:2-events 06:20:31 root 189 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/1:2-events 06:20:31 root 191 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/1:3-cgroup_d 06:20:31 root 194 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/0:3-cgroup_p @@ -21554,8 +21554,8 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:31 root 486 0.0 0.0 0 0 ? 2 00:00:00 06:32:22 xfs-log/dm-0 06:20:31 root 487 0.0 0.0 0 0 ? 2 00:00:00 06:32:22 xfsaild/dm-0 06:20:31 root 555 0.0 0.0 0 0 ? 2 00:00:00 06:32:22 kworker/2:4-events -06:20:31 root 585 0.0 0.0 89936 12076 ? 1 00:00:00 06:32:23 systemd-journal -06:20:31 root 624 0.0 0.0 99808 11036 ? 1 00:00:00 06:32:23 systemd-udevd +06:20:31 root 585 0.0 0.08 89936 12076 ? 1 00:00:00 06:32:23 systemd-journal +06:20:31 root 624 0.0 0.08 99808 11036 ? 1 00:00:00 06:32:23 systemd-udevd 06:20:31 root 655 0.0 0.0 0 0 ? 2 00:00:00 06:32:23 cryptd 06:20:31 root 696 0.0 0.0 0 0 ? 2 00:00:00 06:32:23 kdmflush 06:20:31 root 751 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfs-buf/dm-2 @@ -21572,131 +21572,131 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:31 root 762 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfsaild/dm-2 06:20:31 root 763 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfs-log/sda1 06:20:31 root 764 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfsaild/sda1 -06:20:31 root 788 0.0 0.0 130828 2180 ? 1 00:00:00 06:32:24 auditd -06:20:31 root 790 0.0 0.0 48648 3308 ? 788 00:00:00 06:32:24 sedispatch +06:20:31 root 788 0.0 0.02 130828 2180 ? 1 00:00:00 06:32:24 auditd +06:20:31 root 790 0.0 0.02 48648 3308 ? 788 00:00:00 06:32:24 sedispatch 06:20:31 root 800 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 rpciod 06:20:31 root 801 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xprtiod -06:20:31 root 816 0.0 0.0 7172 1940 ? 1 00:00:00 06:32:24 mcelog -06:20:31 root 821 0.0 0.0 124900 4920 ? 1 00:00:00 06:32:24 irqbalance -06:20:31 root 827 0.0 0.0 17540 1568 ? 1 00:00:00 06:32:24 alsactl -06:20:31 root 834 0.0 0.0 79168 6856 ? 1 00:00:00 06:32:24 systemd-machine -06:20:31 root 835 0.0 0.0 545056 18176 ? 1 00:00:00 06:32:24 udisksd -06:20:31 root 838 0.0 0.0 183488 11484 ? 1 00:00:00 06:32:24 sssd -06:20:31 root 840 0.0 0.0 50696 5992 ? 1 00:00:00 06:32:24 smartd -06:20:31 root 860 0.0 0.0 15500 2776 ? 1 00:00:00 06:32:24 ksmtuned -06:20:31 root 864 0.0 0.0 447888 32184 ? 1 00:00:00 06:32:24 vpnagentd -06:20:31 root 877 0.0 0.0 192396 12724 ? 838 00:00:00 06:32:24 sssd_be -06:20:31 root 884 0.0 0.0 308900 43444 ? 1 00:00:00 06:32:24 firewalld -06:20:31 root 885 0.0 0.0 495736 13620 ? 1 00:00:00 06:32:24 ModemManager -06:20:31 root 897 0.0 0.0 198164 44248 ? 838 00:00:00 06:32:24 sssd_nss -06:20:31 root 941 0.0 0.0 83416 9616 ? 1 00:00:00 06:32:24 systemd-logind -06:20:31 root 946 0.0 0.0 311420 9260 ? 1 00:00:00 06:32:24 accounts-daemon -06:20:31 root 1106 0.1 0.1 396836 20496 ? 1 00:00:00 06:32:24 NetworkManager -06:20:31 root 1117 0.0 0.0 76640 7052 ? 1 00:00:00 06:32:24 sshd -06:20:31 root 1119 0.0 0.0 120920 9832 ? 1 00:00:00 06:32:24 cupsd -06:20:31 root 1120 0.1 0.4 483856 32504 ? 1 00:00:02 06:32:24 tuned -06:20:31 root 1125 0.0 0.0 101792 3792 ? 1 00:00:00 06:32:25 gssproxy -06:20:31 root 1150 0.0 0.0 57392 12296 ? 1 00:00:00 06:32:25 iscsid -06:20:31 root 1151 0.0 0.0 275056 6756 ? 1 00:00:00 06:32:25 rsyslogd +06:20:31 root 816 0.0 0.01 7172 1940 ? 1 00:00:00 06:32:24 mcelog +06:20:31 root 821 0.0 0.03 124900 4920 ? 1 00:00:00 06:32:24 irqbalance +06:20:31 root 827 0.0 0.01 17540 1568 ? 1 00:00:00 06:32:24 alsactl +06:20:31 root 834 0.0 0.05 79168 6856 ? 1 00:00:00 06:32:24 systemd-machine +06:20:31 root 835 0.0 0.13 545056 18176 ? 1 00:00:00 06:32:24 udisksd +06:20:31 root 838 0.0 0.08 183488 11484 ? 1 00:00:00 06:32:24 sssd +06:20:31 root 840 0.0 0.04 50696 5992 ? 1 00:00:00 06:32:24 smartd +06:20:31 root 860 0.0 0.02 15500 2776 ? 1 00:00:00 06:32:24 ksmtuned +06:20:31 root 864 0.0 0.23 447888 32184 ? 1 00:00:00 06:32:24 vpnagentd +06:20:31 root 877 0.0 0.09 192396 12724 ? 838 00:00:00 06:32:24 sssd_be +06:20:31 root 884 0.0 0.31 308900 43444 ? 1 00:00:00 06:32:24 firewalld +06:20:31 root 885 0.0 0.1 495736 13620 ? 1 00:00:00 06:32:24 ModemManager +06:20:31 root 897 0.0 0.31 198164 44248 ? 838 00:00:00 06:32:24 sssd_nss +06:20:31 root 941 0.0 0.07 83416 9616 ? 1 00:00:00 06:32:24 systemd-logind +06:20:31 root 946 0.0 0.07 311420 9260 ? 1 00:00:00 06:32:24 accounts-daemon +06:20:31 root 1106 0.1 0.14 396836 20496 ? 1 00:00:00 06:32:24 NetworkManager +06:20:31 root 1117 0.0 0.05 76640 7052 ? 1 00:00:00 06:32:24 sshd +06:20:31 root 1119 0.0 0.07 120920 9832 ? 1 00:00:00 06:32:24 cupsd +06:20:31 root 1120 0.1 0.23 483856 32504 ? 1 00:00:02 06:32:24 tuned +06:20:31 root 1125 0.0 0.03 101792 3792 ? 1 00:00:00 06:32:25 gssproxy +06:20:31 root 1150 0.0 0.09 57392 12296 ? 1 00:00:00 06:32:25 iscsid +06:20:31 root 1151 0.0 0.05 275056 6756 ? 1 00:00:00 06:32:25 rsyslogd 06:20:31 root 1176 0.0 0.0 0 0 ? 2 00:00:00 06:32:25 iscsi_eh -06:20:31 root 1192 0.0 0.0 25860 3564 ? 1 00:00:00 06:32:25 crond +06:20:31 root 1192 0.0 0.03 25860 3564 ? 1 00:00:00 06:32:25 crond 06:20:31 root 1193 0.0 0.0 0 0 ? 2 00:00:00 06:32:25 kworker/0:4-cgroup_p -06:20:31 root 1194 0.0 0.0 26128 2204 ? 1 00:00:00 06:32:25 atd -06:20:31 root 1633 0.0 0.0 106416 7076 ? 1624 00:00:00 06:32:25 pmdaroot -06:20:31 root 1650 0.1 0.1 100884 8848 ? 1633 00:00:00 06:32:25 pmdaproc -06:20:31 root 1666 0.0 0.0 96904 4716 ? 1633 00:00:00 06:32:25 pmdaxfs -06:20:31 root 1682 0.1 0.1 99880 8004 ? 1633 00:00:00 06:32:25 pmdalinux -06:20:31 root 1690 0.0 0.0 162764 20132 ? 1633 00:00:00 06:32:25 python3 -06:20:31 root 1754 0.0 0.0 96872 4760 ? 1633 00:00:00 06:32:25 pmdakvm -06:20:31 root 1761 0.0 0.0 104712 7188 ? 1633 00:00:00 06:32:25 pmdadm -06:20:31 root 1767 0.0 0.0 256256 26980 ? 1633 00:00:00 06:32:25 python3 +06:20:31 root 1194 0.0 0.02 26128 2204 ? 1 00:00:00 06:32:25 atd +06:20:31 root 1633 0.0 0.05 106416 7076 ? 1624 00:00:00 06:32:25 pmdaroot +06:20:31 root 1650 0.1 0.06 100884 8848 ? 1633 00:00:00 06:32:25 pmdaproc +06:20:31 root 1666 0.0 0.03 96904 4716 ? 1633 00:00:00 06:32:25 pmdaxfs +06:20:31 root 1682 0.1 0.06 99880 8004 ? 1633 00:00:00 06:32:25 pmdalinux +06:20:31 root 1690 0.0 0.14 162764 20132 ? 1633 00:00:00 06:32:25 python3 +06:20:31 root 1754 0.0 0.03 96872 4760 ? 1633 00:00:00 06:32:25 pmdakvm +06:20:31 root 1761 0.0 0.05 104712 7188 ? 1633 00:00:00 06:32:25 pmdadm +06:20:31 root 1767 0.0 0.19 256256 26980 ? 1633 00:00:00 06:32:25 python3 06:20:31 root 2410 0.0 0.0 57540 440 ? 2407 00:00:00 06:32:26 dnsmasq -06:20:31 root 2937 0.0 0.0 320608 10840 ? 1 00:00:00 06:32:27 gdm -06:20:31 root 2953 0.0 0.0 394652 3836 ? 1 00:00:00 06:32:27 VBoxService -06:20:31 root 4956 0.0 0.0 321076 9720 ? 1 00:00:00 06:32:28 upowerd -06:20:31 root 4977 0.0 0.0 61332 6668 ? 1 00:00:00 06:32:28 wpa_supplicant -06:20:31 root 4978 0.0 0.0 858384 320344 ? 1 00:00:05 06:32:28 packagekitd +06:20:31 root 2937 0.0 0.08 320608 10840 ? 1 00:00:00 06:32:27 gdm +06:20:31 root 2953 0.0 0.03 394652 3836 ? 1 00:00:00 06:32:27 VBoxService +06:20:31 root 4956 0.0 0.07 321076 9720 ? 1 00:00:00 06:32:28 upowerd +06:20:31 root 4977 0.0 0.05 61332 6668 ? 1 00:00:00 06:32:28 wpa_supplicant +06:20:31 root 4978 0.0 2.25 858384 320344 ? 1 00:00:05 06:32:28 packagekitd 06:20:31 root 5150 0.0 0.0 0 0 ? 2 00:00:00 06:32:29 kworker/3:4-cgroup_p -06:20:31 root 5714 0.0 0.0 343044 14780 ? 2937 00:00:00 06:32:44 gdm-session-wor -06:20:31 root 5729 0.0 0.0 89756 9932 ? 1 00:00:00 06:32:44 systemd -06:20:31 root 5731 0.0 0.0 293780 5404 ? 5729 00:00:00 06:32:44 (sd-pam) -06:20:31 root 5757 0.0 0.0 307228 7604 ? 1 00:00:00 06:32:44 gnome-keyring-d -06:20:31 root 5764 0.0 0.0 217836 7936 tty2 5714 00:00:00 06:32:44 gdm-wayland-ses -06:20:31 root 5766 0.1 0.1 76556 6756 ? 5729 00:00:00 06:32:44 dbus-daemon -06:20:31 root 5769 0.0 0.0 658996 17544 tty2 5764 00:00:00 06:32:44 gnome-session-b -06:20:31 root 5857 0.2 0.8 4157608 307268 tty2 5769 00:00:07 06:32:44 gnome-shell -06:20:31 root 5901 0.0 0.0 313044 9492 ? 5729 00:00:00 06:32:44 gvfsd -06:20:31 root 5908 0.0 0.0 445348 6940 ? 5729 00:00:00 06:32:44 gvfsd-fuse -06:20:31 root 5916 0.0 0.0 269868 52816 tty2 5857 00:00:00 06:32:44 Xwayland -06:20:31 root 5927 0.0 0.0 372248 11284 ? 5729 00:00:00 06:32:44 at-spi-bus-laun -06:20:31 root 5938 0.0 0.0 75708 5604 ? 5927 00:00:00 06:32:44 dbus-daemon -06:20:31 root 5945 0.0 0.0 248740 8600 ? 5729 00:00:00 06:32:44 at-spi2-registr -06:20:31 root 5963 0.0 0.0 453812 13192 tty2 5857 00:00:00 06:32:44 ibus-daemon -06:20:31 root 5967 0.0 0.0 302936 10716 tty2 5963 00:00:00 06:32:44 ibus-dconf -06:20:31 root 5968 0.0 0.0 293832 9728 ? 5729 00:00:00 06:32:44 xdg-permission- -06:20:31 root 5970 0.0 0.0 438080 28624 tty2 5963 00:00:00 06:32:44 ibus-extension- -06:20:31 root 5976 0.0 0.0 546088 64308 tty2 1 00:00:00 06:32:44 ibus-x11 -06:20:31 root 5979 0.0 0.0 302804 8716 ? 5729 00:00:00 06:32:44 ibus-portal -06:20:31 root 5993 0.0 0.0 687060 23708 ? 5729 00:00:00 06:32:45 gnome-shell-cal -06:20:31 root 5999 0.0 0.0 688112 30968 ? 5729 00:00:00 06:32:45 evolution-sourc -06:20:31 root 6005 0.0 0.0 836252 36364 ? 5729 00:00:00 06:32:45 goa-daemon -06:20:31 root 6014 0.0 0.0 475680 10940 ? 5729 00:00:00 06:32:45 gvfs-udisks2-vo -06:20:31 root 6023 0.0 0.0 300728 7848 ? 5729 00:00:00 06:32:45 gvfs-mtp-volume -06:20:31 root 6030 0.0 0.0 313432 10400 ? 5729 00:00:00 06:32:45 gvfs-gphoto2-vo -06:20:31 root 6034 0.0 0.0 442592 15728 ? 5729 00:00:00 06:32:45 goa-identity-se -06:20:31 root 6042 0.0 0.0 298480 8556 ? 5729 00:00:00 06:32:45 gvfs-goa-volume -06:20:31 root 6050 0.0 0.0 381464 8324 ? 5729 00:00:00 06:32:45 gvfs-afc-volume -06:20:31 root 6055 0.0 0.1 191080 40088 ? 1 00:00:00 06:32:45 sssd_kcm -06:20:31 root 6057 0.0 0.0 612768 26200 tty2 5769 00:00:00 06:32:45 gsd-power -06:20:31 root 6058 0.0 0.0 353676 12400 tty2 5769 00:00:00 06:32:45 gsd-print-notif -06:20:31 root 6060 0.0 0.0 451604 8260 tty2 5769 00:00:00 06:32:45 gsd-rfkill -06:20:31 root 6062 0.0 0.0 299388 7596 tty2 5769 00:00:00 06:32:45 gsd-screensaver -06:20:31 root 6064 0.0 0.0 455408 10220 tty2 5769 00:00:00 06:32:45 gsd-sharing -06:20:31 root 6072 0.0 0.0 367356 11292 tty2 5769 00:00:00 06:32:45 gsd-sound -06:20:31 root 6078 0.0 0.0 524264 25692 tty2 5769 00:00:00 06:32:45 gsd-xsettings -06:20:31 root 6082 0.0 0.0 510204 26088 tty2 5769 00:00:00 06:32:45 gsd-wacom -06:20:31 root 6085 0.0 0.0 840368 31632 ? 5729 00:00:00 06:32:45 evolution-calen -06:20:31 root 6087 0.0 0.0 474636 14620 tty2 5769 00:00:00 06:32:45 gsd-smartcard -06:20:31 root 6088 0.0 0.0 382140 11108 tty2 5769 00:00:00 06:32:45 gsd-account -06:20:31 root 6111 0.0 0.0 301644 8764 tty2 5769 00:00:00 06:32:45 gsd-a11y-settin -06:20:31 root 6113 0.0 0.0 229132 10436 tty2 5963 00:00:00 06:32:45 ibus-engine-sim -06:20:31 root 6115 0.0 0.0 1172012 13208 ? 1 00:00:00 06:32:45 pulseaudio -06:20:31 root 6122 0.0 0.0 373412 24040 tty2 5769 00:00:00 06:32:45 gsd-clipboard -06:20:31 root 6126 0.0 0.0 687008 26468 tty2 5769 00:00:00 06:32:45 gsd-color -06:20:31 root 6128 0.0 0.0 460056 16560 tty2 5769 00:00:00 06:32:45 gsd-datetime -06:20:31 root 6131 0.0 0.0 388720 9964 tty2 5769 00:00:00 06:32:45 gsd-housekeepin -06:20:31 root 6132 0.0 0.0 523188 24360 tty2 5769 00:00:00 06:32:45 gsd-keyboard -06:20:31 root 6138 0.0 0.0 898984 27208 tty2 5769 00:00:00 06:32:45 gsd-media-keys -06:20:31 root 6142 0.0 0.0 301780 10860 tty2 5769 00:00:00 06:32:45 gsd-mouse -06:20:31 root 6188 0.0 0.0 1189836 33212 ? 6085 00:00:00 06:32:45 evolution-calen -06:20:31 root 6216 0.0 0.0 827040 31152 ? 5729 00:00:00 06:32:45 evolution-addre -06:20:31 root 6217 0.0 0.0 214924 7732 ? 5729 00:00:00 06:32:45 dconf-service -06:20:31 root 6219 0.0 0.1 770024 50580 ? 5729 00:00:00 06:32:45 tracker-store -06:20:31 root 6224 0.0 0.0 1171516 143284 tty2 5769 00:00:01 06:32:45 gnome-software -06:20:31 root 6230 0.0 0.0 301372 9128 tty2 5769 00:00:00 06:32:45 gsd-disk-utilit -06:20:31 root 6243 0.0 0.0 1229252 25848 tty2 5769 00:00:00 06:32:45 tracker-miner-a -06:20:31 root 6252 0.0 0.0 517804 15540 tty2 1 00:00:00 06:32:45 gsd-printer -06:20:31 root 6254 0.1 0.2 788224 30540 tty2 5769 00:00:00 06:32:45 tracker-miner-f +06:20:31 root 5714 0.0 0.1 343044 14780 ? 2937 00:00:00 06:32:44 gdm-session-wor +06:20:31 root 5729 0.0 0.07 89756 9932 ? 1 00:00:00 06:32:44 systemd +06:20:31 root 5731 0.0 0.04 293780 5404 ? 5729 00:00:00 06:32:44 (sd-pam) +06:20:31 root 5757 0.0 0.05 307228 7604 ? 1 00:00:00 06:32:44 gnome-keyring-d +06:20:31 root 5764 0.0 0.06 217836 7936 tty2 5714 00:00:00 06:32:44 gdm-wayland-ses +06:20:31 root 5766 0.1 0.05 76556 6756 ? 5729 00:00:00 06:32:44 dbus-daemon +06:20:31 root 5769 0.0 0.12 658996 17544 tty2 5764 00:00:00 06:32:44 gnome-session-b +06:20:31 root 5857 0.2 2.16 4157608 307268 tty2 5769 00:00:07 06:32:44 gnome-shell +06:20:31 root 5901 0.0 0.07 313044 9492 ? 5729 00:00:00 06:32:44 gvfsd +06:20:31 root 5908 0.0 0.05 445348 6940 ? 5729 00:00:00 06:32:44 gvfsd-fuse +06:20:31 root 5916 0.0 0.37 269868 52816 tty2 5857 00:00:00 06:32:44 Xwayland +06:20:31 root 5927 0.0 0.08 372248 11284 ? 5729 00:00:00 06:32:44 at-spi-bus-laun +06:20:31 root 5938 0.0 0.04 75708 5604 ? 5927 00:00:00 06:32:44 dbus-daemon +06:20:31 root 5945 0.0 0.06 248740 8600 ? 5729 00:00:00 06:32:44 at-spi2-registr +06:20:31 root 5963 0.0 0.09 453812 13192 tty2 5857 00:00:00 06:32:44 ibus-daemon +06:20:31 root 5967 0.0 0.08 302936 10716 tty2 5963 00:00:00 06:32:44 ibus-dconf +06:20:31 root 5968 0.0 0.07 293832 9728 ? 5729 00:00:00 06:32:44 xdg-permission- +06:20:31 root 5970 0.0 0.2 438080 28624 tty2 5963 00:00:00 06:32:44 ibus-extension- +06:20:31 root 5976 0.0 0.45 546088 64308 tty2 1 00:00:00 06:32:44 ibus-x11 +06:20:31 root 5979 0.0 0.06 302804 8716 ? 5729 00:00:00 06:32:44 ibus-portal +06:20:31 root 5993 0.0 0.17 687060 23708 ? 5729 00:00:00 06:32:45 gnome-shell-cal +06:20:31 root 5999 0.0 0.22 688112 30968 ? 5729 00:00:00 06:32:45 evolution-sourc +06:20:31 root 6005 0.0 0.26 836252 36364 ? 5729 00:00:00 06:32:45 goa-daemon +06:20:31 root 6014 0.0 0.08 475680 10940 ? 5729 00:00:00 06:32:45 gvfs-udisks2-vo +06:20:31 root 6023 0.0 0.06 300728 7848 ? 5729 00:00:00 06:32:45 gvfs-mtp-volume +06:20:31 root 6030 0.0 0.07 313432 10400 ? 5729 00:00:00 06:32:45 gvfs-gphoto2-vo +06:20:31 root 6034 0.0 0.11 442592 15728 ? 5729 00:00:00 06:32:45 goa-identity-se +06:20:31 root 6042 0.0 0.06 298480 8556 ? 5729 00:00:00 06:32:45 gvfs-goa-volume +06:20:31 root 6050 0.0 0.06 381464 8324 ? 5729 00:00:00 06:32:45 gvfs-afc-volume +06:20:31 root 6055 0.0 0.28 191080 40088 ? 1 00:00:00 06:32:45 sssd_kcm +06:20:31 root 6057 0.0 0.18 612768 26200 tty2 5769 00:00:00 06:32:45 gsd-power +06:20:31 root 6058 0.0 0.09 353676 12400 tty2 5769 00:00:00 06:32:45 gsd-print-notif +06:20:31 root 6060 0.0 0.06 451604 8260 tty2 5769 00:00:00 06:32:45 gsd-rfkill +06:20:31 root 6062 0.0 0.05 299388 7596 tty2 5769 00:00:00 06:32:45 gsd-screensaver +06:20:31 root 6064 0.0 0.07 455408 10220 tty2 5769 00:00:00 06:32:45 gsd-sharing +06:20:31 root 6072 0.0 0.08 367356 11292 tty2 5769 00:00:00 06:32:45 gsd-sound +06:20:31 root 6078 0.0 0.18 524264 25692 tty2 5769 00:00:00 06:32:45 gsd-xsettings +06:20:31 root 6082 0.0 0.18 510204 26088 tty2 5769 00:00:00 06:32:45 gsd-wacom +06:20:31 root 6085 0.0 0.22 840368 31632 ? 5729 00:00:00 06:32:45 evolution-calen +06:20:31 root 6087 0.0 0.1 474636 14620 tty2 5769 00:00:00 06:32:45 gsd-smartcard +06:20:31 root 6088 0.0 0.08 382140 11108 tty2 5769 00:00:00 06:32:45 gsd-account +06:20:31 root 6111 0.0 0.06 301644 8764 tty2 5769 00:00:00 06:32:45 gsd-a11y-settin +06:20:31 root 6113 0.0 0.07 229132 10436 tty2 5963 00:00:00 06:32:45 ibus-engine-sim +06:20:31 root 6115 0.0 0.09 1172012 13208 ? 1 00:00:00 06:32:45 pulseaudio +06:20:31 root 6122 0.0 0.17 373412 24040 tty2 5769 00:00:00 06:32:45 gsd-clipboard +06:20:31 root 6126 0.0 0.19 687008 26468 tty2 5769 00:00:00 06:32:45 gsd-color +06:20:31 root 6128 0.0 0.12 460056 16560 tty2 5769 00:00:00 06:32:45 gsd-datetime +06:20:31 root 6131 0.0 0.07 388720 9964 tty2 5769 00:00:00 06:32:45 gsd-housekeepin +06:20:31 root 6132 0.0 0.17 523188 24360 tty2 5769 00:00:00 06:32:45 gsd-keyboard +06:20:31 root 6138 0.0 0.19 898984 27208 tty2 5769 00:00:00 06:32:45 gsd-media-keys +06:20:31 root 6142 0.0 0.08 301780 10860 tty2 5769 00:00:00 06:32:45 gsd-mouse +06:20:31 root 6188 0.0 0.23 1189836 33212 ? 6085 00:00:00 06:32:45 evolution-calen +06:20:31 root 6216 0.0 0.22 827040 31152 ? 5729 00:00:00 06:32:45 evolution-addre +06:20:31 root 6217 0.0 0.05 214924 7732 ? 5729 00:00:00 06:32:45 dconf-service +06:20:31 root 6219 0.0 0.36 770024 50580 ? 5729 00:00:00 06:32:45 tracker-store +06:20:31 root 6224 0.0 1.01 1171516 143284 tty2 5769 00:00:01 06:32:45 gnome-software +06:20:31 root 6230 0.0 0.06 301372 9128 tty2 5769 00:00:00 06:32:45 gsd-disk-utilit +06:20:31 root 6243 0.0 0.18 1229252 25848 tty2 5769 00:00:00 06:32:45 tracker-miner-a +06:20:31 root 6252 0.0 0.11 517804 15540 tty2 1 00:00:00 06:32:45 gsd-printer +06:20:31 root 6254 0.1 0.21 788224 30540 tty2 5769 00:00:00 06:32:45 tracker-miner-f 06:20:31 root 6288 0.0 0.0 117628 376 ? 1 00:00:00 06:32:46 VBoxClient -06:20:31 root 6294 0.0 0.0 1109452 32004 ? 6216 00:00:00 06:32:46 evolution-addre -06:20:31 root 6297 0.0 0.0 186268 2240 ? 6288 00:00:00 06:32:46 VBoxClient +06:20:31 root 6294 0.0 0.22 1109452 32004 ? 6216 00:00:00 06:32:46 evolution-addre +06:20:31 root 6297 0.0 0.02 186268 2240 ? 6288 00:00:00 06:32:46 VBoxClient 06:20:31 root 6324 0.0 0.0 117628 380 ? 1 00:00:00 06:32:46 VBoxClient -06:20:31 root 6325 0.0 0.0 184196 2844 ? 6324 00:00:00 06:32:46 VBoxClient +06:20:31 root 6325 0.0 0.02 184196 2844 ? 6324 00:00:00 06:32:46 VBoxClient 06:20:31 root 6334 0.0 0.0 117628 380 ? 1 00:00:00 06:32:46 VBoxClient -06:20:31 root 6335 0.1 0.1 250248 2720 ? 6334 00:00:00 06:32:46 VBoxClient +06:20:31 root 6335 0.1 0.02 250248 2720 ? 6334 00:00:00 06:32:46 VBoxClient 06:20:31 root 6342 0.0 0.0 117628 380 ? 1 00:00:00 06:32:46 VBoxClient -06:20:31 root 6343 0.0 0.0 94116 1252 ? 6342 00:00:00 06:32:46 VBoxDRMClient -06:20:31 root 6432 0.0 0.0 637144 25848 ? 1 00:00:00 06:32:46 fwupd -06:20:31 root 6834 0.0 0.0 537140 49588 ? 5729 00:00:00 06:32:55 gnome-terminal- -06:20:31 root 6839 0.0 0.0 16800 5772 pts/0 6834 00:00:00 06:32:55 bash +06:20:31 root 6343 0.0 0.01 94116 1252 ? 6342 00:00:00 06:32:46 VBoxDRMClient +06:20:31 root 6432 0.0 0.18 637144 25848 ? 1 00:00:00 06:32:46 fwupd +06:20:31 root 6834 0.0 0.35 537140 49588 ? 5729 00:00:00 06:32:55 gnome-terminal- +06:20:31 root 6839 0.0 0.04 16800 5772 pts/0 6834 00:00:00 06:32:55 bash 06:20:31 root 6941 0.0 0.0 0 0 ? 2 00:00:00 06:32:59 kworker/1:4-cgroup_p -06:20:31 root 8571 0.0 0.0 227008 8832 ? 5729 00:00:00 06:33:50 gvfsd-metadata -06:20:31 root 9308 0.0 0.0 7312 892 ? 860 00:00:00 06:37:24 sleep -06:20:31 root 9327 0.0 0.0 12976 3240 pts/0 6839 00:00:00 06:37:42 mk.ps -06:20:31 root 9344 0.0 0.0 97072 7052 pts/0 9327 00:00:00 06:37:42 pmlogger -06:20:31 root 9349 0.1 0.7 1173832 20680 ? 5729 00:00:00 06:37:42 tracker-extract +06:20:31 root 8571 0.0 0.06 227008 8832 ? 5729 00:00:00 06:33:50 gvfsd-metadata +06:20:31 root 9308 0.0 0.01 7312 892 ? 860 00:00:00 06:37:24 sleep +06:20:31 root 9327 0.0 0.02 12976 3240 pts/0 6839 00:00:00 06:37:42 mk.ps +06:20:31 root 9344 0.0 0.05 97072 7052 pts/0 9327 00:00:00 06:37:42 pmlogger +06:20:31 root 9349 0.1 0.15 1173832 20680 ? 5729 00:00:00 06:37:42 tracker-extract Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:32 root 1 0.0 0.0 241324 14332 ? 0 00:00:01 06:32:20 systemd +06:20:32 root 1 0.0 0.1 241324 14332 ? 0 00:00:01 06:32:20 systemd 06:20:32 root 2 0.0 0.0 0 0 ? 0 00:00:00 06:32:20 kthreadd 06:20:32 root 3 0.0 0.0 0 0 ? 2 00:00:00 06:32:20 rcu_gp 06:20:32 root 4 0.0 0.0 0 0 ? 2 00:00:00 06:32:20 rcu_par_gp @@ -21763,7 +21763,7 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:32 root 125 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/u9:0 06:20:32 root 127 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/1:1-ata_sff 06:20:32 root 135 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 charger_manager -06:20:32 root 186 0.1 0.1 0 0 ? 2 00:00:00 06:32:21 kworker/3:2-events +06:20:32 root 186 0.1 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/3:2-events 06:20:32 root 189 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/1:2-events 06:20:32 root 191 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/1:3-cgroup_d 06:20:32 root 194 0.0 0.0 0 0 ? 2 00:00:00 06:32:21 kworker/0:3-cgroup_p @@ -21794,8 +21794,8 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:32 root 486 0.0 0.0 0 0 ? 2 00:00:00 06:32:22 xfs-log/dm-0 06:20:32 root 487 0.0 0.0 0 0 ? 2 00:00:00 06:32:22 xfsaild/dm-0 06:20:32 root 555 0.0 0.0 0 0 ? 2 00:00:00 06:32:22 kworker/2:4-events -06:20:32 root 585 0.0 0.0 89936 12076 ? 1 00:00:00 06:32:23 systemd-journal -06:20:32 root 624 0.0 0.0 99808 11036 ? 1 00:00:00 06:32:23 systemd-udevd +06:20:32 root 585 0.0 0.08 89936 12076 ? 1 00:00:00 06:32:23 systemd-journal +06:20:32 root 624 0.0 0.08 99808 11036 ? 1 00:00:00 06:32:23 systemd-udevd 06:20:32 root 655 0.0 0.0 0 0 ? 2 00:00:00 06:32:23 cryptd 06:20:32 root 696 0.0 0.0 0 0 ? 2 00:00:00 06:32:23 kdmflush 06:20:32 root 751 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfs-buf/dm-2 @@ -21812,134 +21812,134 @@ Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND 06:20:32 root 762 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfsaild/dm-2 06:20:32 root 763 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfs-log/sda1 06:20:32 root 764 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xfsaild/sda1 -06:20:32 root 788 0.0 0.0 130828 2180 ? 1 00:00:00 06:32:24 auditd -06:20:32 root 790 0.0 0.0 48648 3308 ? 788 00:00:00 06:32:24 sedispatch +06:20:32 root 788 0.0 0.02 130828 2180 ? 1 00:00:00 06:32:24 auditd +06:20:32 root 790 0.0 0.02 48648 3308 ? 788 00:00:00 06:32:24 sedispatch 06:20:32 root 800 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 rpciod 06:20:32 root 801 0.0 0.0 0 0 ? 2 00:00:00 06:32:24 xprtiod -06:20:32 root 816 0.0 0.0 7172 1940 ? 1 00:00:00 06:32:24 mcelog -06:20:32 root 821 0.0 0.0 124900 4920 ? 1 00:00:00 06:32:24 irqbalance -06:20:32 root 827 0.0 0.0 17540 1568 ? 1 00:00:00 06:32:24 alsactl -06:20:32 root 834 0.0 0.0 79168 6856 ? 1 00:00:00 06:32:24 systemd-machine -06:20:32 root 835 0.0 0.0 545056 18176 ? 1 00:00:00 06:32:24 udisksd -06:20:32 root 838 0.0 0.0 183488 11484 ? 1 00:00:00 06:32:24 sssd -06:20:32 root 840 0.0 0.0 50696 5992 ? 1 00:00:00 06:32:24 smartd -06:20:32 root 860 0.0 0.0 15500 2776 ? 1 00:00:00 06:32:24 ksmtuned -06:20:32 root 864 0.0 0.0 447888 32184 ? 1 00:00:00 06:32:24 vpnagentd -06:20:32 root 877 0.0 0.0 192396 12724 ? 838 00:00:00 06:32:24 sssd_be -06:20:32 root 884 0.0 0.0 308900 43444 ? 1 00:00:00 06:32:24 firewalld -06:20:32 root 885 0.0 0.0 495736 13620 ? 1 00:00:00 06:32:24 ModemManager -06:20:32 root 897 0.0 0.0 198164 44248 ? 838 00:00:00 06:32:24 sssd_nss -06:20:32 root 941 0.0 0.0 83416 9616 ? 1 00:00:00 06:32:24 systemd-logind -06:20:32 root 946 0.0 0.0 311420 9260 ? 1 00:00:00 06:32:24 accounts-daemon -06:20:32 root 1106 0.1 0.1 396836 20496 ? 1 00:00:00 06:32:24 NetworkManager -06:20:32 root 1117 0.0 0.0 76640 7052 ? 1 00:00:00 06:32:24 sshd -06:20:32 root 1119 0.0 0.0 120920 9832 ? 1 00:00:00 06:32:24 cupsd -06:20:32 root 1120 0.1 0.4 483856 32504 ? 1 00:00:02 06:32:24 tuned -06:20:32 root 1125 0.0 0.0 101792 3792 ? 1 00:00:00 06:32:25 gssproxy -06:20:32 root 1150 0.0 0.0 57392 12296 ? 1 00:00:00 06:32:25 iscsid -06:20:32 root 1151 0.0 0.0 275056 6756 ? 1 00:00:00 06:32:25 rsyslogd +06:20:32 root 816 0.0 0.01 7172 1940 ? 1 00:00:00 06:32:24 mcelog +06:20:32 root 821 0.0 0.03 124900 4920 ? 1 00:00:00 06:32:24 irqbalance +06:20:32 root 827 0.0 0.01 17540 1568 ? 1 00:00:00 06:32:24 alsactl +06:20:32 root 834 0.0 0.05 79168 6856 ? 1 00:00:00 06:32:24 systemd-machine +06:20:32 root 835 0.0 0.13 545056 18176 ? 1 00:00:00 06:32:24 udisksd +06:20:32 root 838 0.0 0.08 183488 11484 ? 1 00:00:00 06:32:24 sssd +06:20:32 root 840 0.0 0.04 50696 5992 ? 1 00:00:00 06:32:24 smartd +06:20:32 root 860 0.0 0.02 15500 2776 ? 1 00:00:00 06:32:24 ksmtuned +06:20:32 root 864 0.0 0.23 447888 32184 ? 1 00:00:00 06:32:24 vpnagentd +06:20:32 root 877 0.0 0.09 192396 12724 ? 838 00:00:00 06:32:24 sssd_be +06:20:32 root 884 0.0 0.31 308900 43444 ? 1 00:00:00 06:32:24 firewalld +06:20:32 root 885 0.0 0.1 495736 13620 ? 1 00:00:00 06:32:24 ModemManager +06:20:32 root 897 0.0 0.31 198164 44248 ? 838 00:00:00 06:32:24 sssd_nss +06:20:32 root 941 0.0 0.07 83416 9616 ? 1 00:00:00 06:32:24 systemd-logind +06:20:32 root 946 0.0 0.07 311420 9260 ? 1 00:00:00 06:32:24 accounts-daemon +06:20:32 root 1106 0.1 0.14 396836 20496 ? 1 00:00:00 06:32:24 NetworkManager +06:20:32 root 1117 0.0 0.05 76640 7052 ? 1 00:00:00 06:32:24 sshd +06:20:32 root 1119 0.0 0.07 120920 9832 ? 1 00:00:00 06:32:24 cupsd +06:20:32 root 1120 0.1 0.23 483856 32504 ? 1 00:00:02 06:32:24 tuned +06:20:32 root 1125 0.0 0.03 101792 3792 ? 1 00:00:00 06:32:25 gssproxy +06:20:32 root 1150 0.0 0.09 57392 12296 ? 1 00:00:00 06:32:25 iscsid +06:20:32 root 1151 0.0 0.05 275056 6756 ? 1 00:00:00 06:32:25 rsyslogd 06:20:32 root 1176 0.0 0.0 0 0 ? 2 00:00:00 06:32:25 iscsi_eh -06:20:32 root 1192 0.0 0.0 25860 3564 ? 1 00:00:00 06:32:25 crond +06:20:32 root 1192 0.0 0.03 25860 3564 ? 1 00:00:00 06:32:25 crond 06:20:32 root 1193 0.0 0.0 0 0 ? 2 00:00:00 06:32:25 kworker/0:4-cgroup_p -06:20:32 root 1194 0.0 0.0 26128 2204 ? 1 00:00:00 06:32:25 atd -06:20:32 root 1633 0.0 0.0 106416 7076 ? 1624 00:00:00 06:32:25 pmdaroot -06:20:32 root 1650 0.1 0.1 100884 8848 ? 1633 00:00:00 06:32:25 pmdaproc -06:20:32 root 1666 0.0 0.0 96904 4716 ? 1633 00:00:00 06:32:25 pmdaxfs -06:20:32 root 1682 0.1 0.1 99880 8004 ? 1633 00:00:00 06:32:25 pmdalinux -06:20:32 root 1690 0.0 0.0 162764 20132 ? 1633 00:00:00 06:32:25 python3 -06:20:32 root 1754 0.0 0.0 96872 4760 ? 1633 00:00:00 06:32:25 pmdakvm -06:20:32 root 1761 0.0 0.0 104712 7188 ? 1633 00:00:00 06:32:25 pmdadm -06:20:32 root 1767 0.0 0.0 256256 26980 ? 1633 00:00:00 06:32:25 python3 +06:20:32 root 1194 0.0 0.02 26128 2204 ? 1 00:00:00 06:32:25 atd +06:20:32 root 1633 0.0 0.05 106416 7076 ? 1624 00:00:00 06:32:25 pmdaroot +06:20:32 root 1650 0.1 0.06 100884 8848 ? 1633 00:00:00 06:32:25 pmdaproc +06:20:32 root 1666 0.0 0.03 96904 4716 ? 1633 00:00:00 06:32:25 pmdaxfs +06:20:32 root 1682 0.1 0.06 99880 8004 ? 1633 00:00:00 06:32:25 pmdalinux +06:20:32 root 1690 0.0 0.14 162764 20132 ? 1633 00:00:00 06:32:25 python3 +06:20:32 root 1754 0.0 0.03 96872 4760 ? 1633 00:00:00 06:32:25 pmdakvm +06:20:32 root 1761 0.0 0.05 104712 7188 ? 1633 00:00:00 06:32:25 pmdadm +06:20:32 root 1767 0.0 0.19 256256 26980 ? 1633 00:00:00 06:32:25 python3 06:20:32 root 2410 0.0 0.0 57540 440 ? 2407 00:00:00 06:32:26 dnsmasq -06:20:32 root 2937 0.0 0.0 320608 10840 ? 1 00:00:00 06:32:27 gdm -06:20:32 root 2953 0.0 0.0 394652 3836 ? 1 00:00:00 06:32:27 VBoxService -06:20:32 root 4956 0.0 0.0 321076 9720 ? 1 00:00:00 06:32:28 upowerd -06:20:32 root 4977 0.0 0.0 61332 6668 ? 1 00:00:00 06:32:28 wpa_supplicant -06:20:32 root 4978 0.0 0.0 858384 320344 ? 1 00:00:05 06:32:28 packagekitd +06:20:32 root 2937 0.0 0.08 320608 10840 ? 1 00:00:00 06:32:27 gdm +06:20:32 root 2953 0.0 0.03 394652 3836 ? 1 00:00:00 06:32:27 VBoxService +06:20:32 root 4956 0.0 0.07 321076 9720 ? 1 00:00:00 06:32:28 upowerd +06:20:32 root 4977 0.0 0.05 61332 6668 ? 1 00:00:00 06:32:28 wpa_supplicant +06:20:32 root 4978 0.0 2.25 858384 320344 ? 1 00:00:05 06:32:28 packagekitd 06:20:32 root 5150 0.0 0.0 0 0 ? 2 00:00:00 06:32:29 kworker/3:4-cgroup_p -06:20:32 root 5714 0.0 0.0 343044 14780 ? 2937 00:00:00 06:32:44 gdm-session-wor -06:20:32 root 5729 0.0 0.0 89756 9932 ? 1 00:00:00 06:32:44 systemd -06:20:32 root 5731 0.0 0.0 293780 5404 ? 5729 00:00:00 06:32:44 (sd-pam) -06:20:32 root 5757 0.0 0.0 307228 7604 ? 1 00:00:00 06:32:44 gnome-keyring-d -06:20:32 root 5764 0.0 0.0 217836 7936 tty2 5714 00:00:00 06:32:44 gdm-wayland-ses -06:20:32 root 5766 0.1 0.1 76556 6756 ? 5729 00:00:00 06:32:44 dbus-daemon -06:20:32 root 5769 0.0 0.0 658996 17544 tty2 5764 00:00:00 06:32:44 gnome-session-b -06:20:32 root 5857 0.2 0.8 4157608 307268 tty2 5769 00:00:07 06:32:44 gnome-shell -06:20:32 root 5901 0.0 0.0 313044 9492 ? 5729 00:00:00 06:32:44 gvfsd -06:20:32 root 5908 0.0 0.0 445348 6940 ? 5729 00:00:00 06:32:44 gvfsd-fuse -06:20:32 root 5916 0.0 0.0 269868 52816 tty2 5857 00:00:00 06:32:44 Xwayland -06:20:32 root 5927 0.0 0.0 372248 11284 ? 5729 00:00:00 06:32:44 at-spi-bus-laun -06:20:32 root 5938 0.0 0.0 75708 5604 ? 5927 00:00:00 06:32:44 dbus-daemon -06:20:32 root 5945 0.0 0.0 248740 8600 ? 5729 00:00:00 06:32:44 at-spi2-registr -06:20:32 root 5963 0.0 0.0 453812 13192 tty2 5857 00:00:00 06:32:44 ibus-daemon -06:20:32 root 5967 0.0 0.0 302936 10716 tty2 5963 00:00:00 06:32:44 ibus-dconf -06:20:32 root 5968 0.0 0.0 293832 9728 ? 5729 00:00:00 06:32:44 xdg-permission- -06:20:32 root 5970 0.0 0.0 438080 28624 tty2 5963 00:00:00 06:32:44 ibus-extension- -06:20:32 root 5976 0.0 0.0 546088 64308 tty2 1 00:00:00 06:32:44 ibus-x11 -06:20:32 root 5979 0.0 0.0 302804 8716 ? 5729 00:00:00 06:32:44 ibus-portal -06:20:32 root 5993 0.0 0.0 687060 23708 ? 5729 00:00:00 06:32:45 gnome-shell-cal -06:20:32 root 5999 0.0 0.0 688112 30968 ? 5729 00:00:00 06:32:45 evolution-sourc -06:20:32 root 6005 0.0 0.0 836252 36364 ? 5729 00:00:00 06:32:45 goa-daemon -06:20:32 root 6014 0.0 0.0 475680 10940 ? 5729 00:00:00 06:32:45 gvfs-udisks2-vo -06:20:32 root 6023 0.0 0.0 300728 7848 ? 5729 00:00:00 06:32:45 gvfs-mtp-volume -06:20:32 root 6030 0.0 0.0 313432 10400 ? 5729 00:00:00 06:32:45 gvfs-gphoto2-vo -06:20:32 root 6034 0.0 0.0 442592 15728 ? 5729 00:00:00 06:32:45 goa-identity-se -06:20:32 root 6042 0.0 0.0 298480 8556 ? 5729 00:00:00 06:32:45 gvfs-goa-volume -06:20:32 root 6050 0.0 0.0 381464 8324 ? 5729 00:00:00 06:32:45 gvfs-afc-volume -06:20:32 root 6055 0.0 0.1 191080 40088 ? 1 00:00:00 06:32:45 sssd_kcm -06:20:32 root 6057 0.0 0.0 612768 26200 tty2 5769 00:00:00 06:32:45 gsd-power -06:20:32 root 6058 0.0 0.0 353676 12400 tty2 5769 00:00:00 06:32:45 gsd-print-notif -06:20:32 root 6060 0.0 0.0 451604 8260 tty2 5769 00:00:00 06:32:45 gsd-rfkill -06:20:32 root 6062 0.0 0.0 299388 7596 tty2 5769 00:00:00 06:32:45 gsd-screensaver -06:20:32 root 6064 0.0 0.0 455408 10220 tty2 5769 00:00:00 06:32:45 gsd-sharing -06:20:32 root 6072 0.0 0.0 367356 11292 tty2 5769 00:00:00 06:32:45 gsd-sound -06:20:32 root 6078 0.0 0.0 524264 25692 tty2 5769 00:00:00 06:32:45 gsd-xsettings -06:20:32 root 6082 0.0 0.0 510204 26088 tty2 5769 00:00:00 06:32:45 gsd-wacom -06:20:32 root 6085 0.0 0.0 840368 31632 ? 5729 00:00:00 06:32:45 evolution-calen -06:20:32 root 6087 0.0 0.0 474636 14620 tty2 5769 00:00:00 06:32:45 gsd-smartcard -06:20:32 root 6088 0.0 0.0 382140 11108 tty2 5769 00:00:00 06:32:45 gsd-account -06:20:32 root 6111 0.0 0.0 301644 8764 tty2 5769 00:00:00 06:32:45 gsd-a11y-settin -06:20:32 root 6113 0.0 0.0 229132 10436 tty2 5963 00:00:00 06:32:45 ibus-engine-sim -06:20:32 root 6115 0.0 0.0 1172012 13208 ? 1 00:00:00 06:32:45 pulseaudio -06:20:32 root 6122 0.0 0.0 373412 24040 tty2 5769 00:00:00 06:32:45 gsd-clipboard -06:20:32 root 6126 0.0 0.0 687008 26468 tty2 5769 00:00:00 06:32:45 gsd-color -06:20:32 root 6128 0.0 0.0 460056 16560 tty2 5769 00:00:00 06:32:45 gsd-datetime -06:20:32 root 6131 0.0 0.0 388720 9964 tty2 5769 00:00:00 06:32:45 gsd-housekeepin -06:20:32 root 6132 0.0 0.0 523188 24360 tty2 5769 00:00:00 06:32:45 gsd-keyboard -06:20:32 root 6138 0.0 0.0 898984 27208 tty2 5769 00:00:00 06:32:45 gsd-media-keys -06:20:32 root 6142 0.0 0.0 301780 10860 tty2 5769 00:00:00 06:32:45 gsd-mouse -06:20:32 root 6188 0.0 0.0 1189836 33212 ? 6085 00:00:00 06:32:45 evolution-calen -06:20:32 root 6216 0.0 0.0 827040 31152 ? 5729 00:00:00 06:32:45 evolution-addre -06:20:32 root 6217 0.0 0.0 214924 7732 ? 5729 00:00:00 06:32:45 dconf-service -06:20:32 root 6219 0.0 0.1 770024 50580 ? 5729 00:00:00 06:32:45 tracker-store -06:20:32 root 6224 0.0 0.0 1171516 143284 tty2 5769 00:00:01 06:32:45 gnome-software -06:20:32 root 6230 0.0 0.0 301372 9128 tty2 5769 00:00:00 06:32:45 gsd-disk-utilit -06:20:32 root 6243 0.0 0.0 1229252 25848 tty2 5769 00:00:00 06:32:45 tracker-miner-a -06:20:32 root 6252 0.0 0.0 517804 15540 tty2 1 00:00:00 06:32:45 gsd-printer -06:20:32 root 6254 0.1 0.2 788224 30540 tty2 5769 00:00:00 06:32:45 tracker-miner-f +06:20:32 root 5714 0.0 0.1 343044 14780 ? 2937 00:00:00 06:32:44 gdm-session-wor +06:20:32 root 5729 0.0 0.07 89756 9932 ? 1 00:00:00 06:32:44 systemd +06:20:32 root 5731 0.0 0.04 293780 5404 ? 5729 00:00:00 06:32:44 (sd-pam) +06:20:32 root 5757 0.0 0.05 307228 7604 ? 1 00:00:00 06:32:44 gnome-keyring-d +06:20:32 root 5764 0.0 0.06 217836 7936 tty2 5714 00:00:00 06:32:44 gdm-wayland-ses +06:20:32 root 5766 0.1 0.05 76556 6756 ? 5729 00:00:00 06:32:44 dbus-daemon +06:20:32 root 5769 0.0 0.12 658996 17544 tty2 5764 00:00:00 06:32:44 gnome-session-b +06:20:32 root 5857 0.2 2.16 4157608 307268 tty2 5769 00:00:07 06:32:44 gnome-shell +06:20:32 root 5901 0.0 0.07 313044 9492 ? 5729 00:00:00 06:32:44 gvfsd +06:20:32 root 5908 0.0 0.05 445348 6940 ? 5729 00:00:00 06:32:44 gvfsd-fuse +06:20:32 root 5916 0.0 0.37 269868 52816 tty2 5857 00:00:00 06:32:44 Xwayland +06:20:32 root 5927 0.0 0.08 372248 11284 ? 5729 00:00:00 06:32:44 at-spi-bus-laun +06:20:32 root 5938 0.0 0.04 75708 5604 ? 5927 00:00:00 06:32:44 dbus-daemon +06:20:32 root 5945 0.0 0.06 248740 8600 ? 5729 00:00:00 06:32:44 at-spi2-registr +06:20:32 root 5963 0.0 0.09 453812 13192 tty2 5857 00:00:00 06:32:44 ibus-daemon +06:20:32 root 5967 0.0 0.08 302936 10716 tty2 5963 00:00:00 06:32:44 ibus-dconf +06:20:32 root 5968 0.0 0.07 293832 9728 ? 5729 00:00:00 06:32:44 xdg-permission- +06:20:32 root 5970 0.0 0.2 438080 28624 tty2 5963 00:00:00 06:32:44 ibus-extension- +06:20:32 root 5976 0.0 0.45 546088 64308 tty2 1 00:00:00 06:32:44 ibus-x11 +06:20:32 root 5979 0.0 0.06 302804 8716 ? 5729 00:00:00 06:32:44 ibus-portal +06:20:32 root 5993 0.0 0.17 687060 23708 ? 5729 00:00:00 06:32:45 gnome-shell-cal +06:20:32 root 5999 0.0 0.22 688112 30968 ? 5729 00:00:00 06:32:45 evolution-sourc +06:20:32 root 6005 0.0 0.26 836252 36364 ? 5729 00:00:00 06:32:45 goa-daemon +06:20:32 root 6014 0.0 0.08 475680 10940 ? 5729 00:00:00 06:32:45 gvfs-udisks2-vo +06:20:32 root 6023 0.0 0.06 300728 7848 ? 5729 00:00:00 06:32:45 gvfs-mtp-volume +06:20:32 root 6030 0.0 0.07 313432 10400 ? 5729 00:00:00 06:32:45 gvfs-gphoto2-vo +06:20:32 root 6034 0.0 0.11 442592 15728 ? 5729 00:00:00 06:32:45 goa-identity-se +06:20:32 root 6042 0.0 0.06 298480 8556 ? 5729 00:00:00 06:32:45 gvfs-goa-volume +06:20:32 root 6050 0.0 0.06 381464 8324 ? 5729 00:00:00 06:32:45 gvfs-afc-volume +06:20:32 root 6055 0.0 0.28 191080 40088 ? 1 00:00:00 06:32:45 sssd_kcm +06:20:32 root 6057 0.0 0.18 612768 26200 tty2 5769 00:00:00 06:32:45 gsd-power +06:20:32 root 6058 0.0 0.09 353676 12400 tty2 5769 00:00:00 06:32:45 gsd-print-notif +06:20:32 root 6060 0.0 0.06 451604 8260 tty2 5769 00:00:00 06:32:45 gsd-rfkill +06:20:32 root 6062 0.0 0.05 299388 7596 tty2 5769 00:00:00 06:32:45 gsd-screensaver +06:20:32 root 6064 0.0 0.07 455408 10220 tty2 5769 00:00:00 06:32:45 gsd-sharing +06:20:32 root 6072 0.0 0.08 367356 11292 tty2 5769 00:00:00 06:32:45 gsd-sound +06:20:32 root 6078 0.0 0.18 524264 25692 tty2 5769 00:00:00 06:32:45 gsd-xsettings +06:20:32 root 6082 0.0 0.18 510204 26088 tty2 5769 00:00:00 06:32:45 gsd-wacom +06:20:32 root 6085 0.0 0.22 840368 31632 ? 5729 00:00:00 06:32:45 evolution-calen +06:20:32 root 6087 0.0 0.1 474636 14620 tty2 5769 00:00:00 06:32:45 gsd-smartcard +06:20:32 root 6088 0.0 0.08 382140 11108 tty2 5769 00:00:00 06:32:45 gsd-account +06:20:32 root 6111 0.0 0.06 301644 8764 tty2 5769 00:00:00 06:32:45 gsd-a11y-settin +06:20:32 root 6113 0.0 0.07 229132 10436 tty2 5963 00:00:00 06:32:45 ibus-engine-sim +06:20:32 root 6115 0.0 0.09 1172012 13208 ? 1 00:00:00 06:32:45 pulseaudio +06:20:32 root 6122 0.0 0.17 373412 24040 tty2 5769 00:00:00 06:32:45 gsd-clipboard +06:20:32 root 6126 0.0 0.19 687008 26468 tty2 5769 00:00:00 06:32:45 gsd-color +06:20:32 root 6128 0.0 0.12 460056 16560 tty2 5769 00:00:00 06:32:45 gsd-datetime +06:20:32 root 6131 0.0 0.07 388720 9964 tty2 5769 00:00:00 06:32:45 gsd-housekeepin +06:20:32 root 6132 0.0 0.17 523188 24360 tty2 5769 00:00:00 06:32:45 gsd-keyboard +06:20:32 root 6138 0.0 0.19 898984 27208 tty2 5769 00:00:00 06:32:45 gsd-media-keys +06:20:32 root 6142 0.0 0.08 301780 10860 tty2 5769 00:00:00 06:32:45 gsd-mouse +06:20:32 root 6188 0.0 0.23 1189836 33212 ? 6085 00:00:00 06:32:45 evolution-calen +06:20:32 root 6216 0.0 0.22 827040 31152 ? 5729 00:00:00 06:32:45 evolution-addre +06:20:32 root 6217 0.0 0.05 214924 7732 ? 5729 00:00:00 06:32:45 dconf-service +06:20:32 root 6219 0.0 0.36 770024 50580 ? 5729 00:00:00 06:32:45 tracker-store +06:20:32 root 6224 0.0 1.01 1171516 143284 tty2 5769 00:00:01 06:32:45 gnome-software +06:20:32 root 6230 0.0 0.06 301372 9128 tty2 5769 00:00:00 06:32:45 gsd-disk-utilit +06:20:32 root 6243 0.0 0.18 1229252 25848 tty2 5769 00:00:00 06:32:45 tracker-miner-a +06:20:32 root 6252 0.0 0.11 517804 15540 tty2 1 00:00:00 06:32:45 gsd-printer +06:20:32 root 6254 0.1 0.21 788224 30540 tty2 5769 00:00:00 06:32:45 tracker-miner-f 06:20:32 root 6288 0.0 0.0 117628 376 ? 1 00:00:00 06:32:46 VBoxClient -06:20:32 root 6294 0.0 0.0 1109452 32004 ? 6216 00:00:00 06:32:46 evolution-addre -06:20:32 root 6297 0.0 0.0 186268 2240 ? 6288 00:00:00 06:32:46 VBoxClient +06:20:32 root 6294 0.0 0.22 1109452 32004 ? 6216 00:00:00 06:32:46 evolution-addre +06:20:32 root 6297 0.0 0.02 186268 2240 ? 6288 00:00:00 06:32:46 VBoxClient 06:20:32 root 6324 0.0 0.0 117628 380 ? 1 00:00:00 06:32:46 VBoxClient -06:20:32 root 6325 0.0 0.0 184196 2844 ? 6324 00:00:00 06:32:46 VBoxClient +06:20:32 root 6325 0.0 0.02 184196 2844 ? 6324 00:00:00 06:32:46 VBoxClient 06:20:32 root 6334 0.0 0.0 117628 380 ? 1 00:00:00 06:32:46 VBoxClient -06:20:32 root 6335 0.1 0.1 250248 2720 ? 6334 00:00:00 06:32:46 VBoxClient +06:20:32 root 6335 0.1 0.02 250248 2720 ? 6334 00:00:00 06:32:46 VBoxClient 06:20:32 root 6342 0.0 0.0 117628 380 ? 1 00:00:00 06:32:46 VBoxClient -06:20:32 root 6343 0.0 0.0 94116 1252 ? 6342 00:00:00 06:32:46 VBoxDRMClient -06:20:32 root 6432 0.0 0.0 637144 25848 ? 1 00:00:00 06:32:46 fwupd -06:20:32 root 6834 0.0 0.0 537140 49588 ? 5729 00:00:00 06:32:55 gnome-terminal- -06:20:32 root 6839 0.0 0.0 16800 5772 pts/0 6834 00:00:00 06:32:55 bash +06:20:32 root 6343 0.0 0.01 94116 1252 ? 6342 00:00:00 06:32:46 VBoxDRMClient +06:20:32 root 6432 0.0 0.18 637144 25848 ? 1 00:00:00 06:32:46 fwupd +06:20:32 root 6834 0.0 0.35 537140 49588 ? 5729 00:00:00 06:32:55 gnome-terminal- +06:20:32 root 6839 0.0 0.04 16800 5772 pts/0 6834 00:00:00 06:32:55 bash 06:20:32 root 6941 0.0 0.0 0 0 ? 2 00:00:00 06:32:59 kworker/1:4-cgroup_p -06:20:32 root 8571 0.0 0.0 227008 8832 ? 5729 00:00:00 06:33:50 gvfsd-metadata -06:20:32 root 9308 0.0 0.0 7312 892 ? 860 00:00:00 06:37:24 sleep -06:20:32 root 9327 0.0 0.0 12976 3240 pts/0 6839 00:00:00 06:37:42 mk.ps -06:20:32 root 9344 0.0 0.0 97072 7052 pts/0 9327 00:00:00 06:37:42 pmlogger -06:20:32 root 9349 0.1 0.7 1173832 20680 ? 5729 00:00:00 06:37:42 tracker-extract +06:20:32 root 8571 0.0 0.06 227008 8832 ? 5729 00:00:00 06:33:50 gvfsd-metadata +06:20:32 root 9308 0.0 0.01 7312 892 ? 860 00:00:00 06:37:24 sleep +06:20:32 root 9327 0.0 0.02 12976 3240 pts/0 6839 00:00:00 06:37:42 mk.ps +06:20:32 root 9344 0.0 0.05 97072 7052 pts/0 9327 00:00:00 06:37:42 pmlogger +06:20:32 root 9349 0.1 0.15 1173832 20680 ? 5729 00:00:00 06:37:42 tracker-extract pcp-ps output : Display the begining 10 process to test broken pipe Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:31 root 1 0.0 0.0 241324 14332 ? S 00:00:01 06:32:20 systemd +06:20:31 root 1 0.0 0.1 241324 14332 ? S 00:00:01 06:32:20 systemd 06:20:31 root 2 0.0 0.0 0 0 ? S 00:00:00 06:32:20 kthreadd 06:20:31 root 3 0.0 0.0 0 0 ? I 00:00:00 06:32:20 rcu_gp 06:20:31 root 4 0.0 0.0 0 0 ? I 00:00:00 06:32:20 rcu_par_gp @@ -22981,62 +22981,62 @@ Timestamp PID PPID TTY Command pcp-ps output : Display the value as per %cpu sorted Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:31 root 5857 0.2 0.8 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell -06:20:31 polkitd 820 0.0 0.0 1759272 26660 ? S 00:00:00 06:32:24 polkitd -06:20:31 root 6243 0.0 0.0 1229252 25848 tty2 S 00:00:00 06:32:45 tracker-miner-a -06:20:31 root 6188 0.0 0.0 1189836 33212 ? S 00:00:00 06:32:45 evolution-calen -06:20:31 root 9349 0.1 0.7 1173832 20680 ? R 00:00:00 06:37:42 tracker-extract -06:20:31 root 6115 0.0 0.0 1172012 13208 ? S 00:00:00 06:32:45 pulseaudio -06:20:31 root 6224 0.0 0.0 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software -06:20:31 root 6294 0.0 0.0 1109452 32004 ? S 00:00:00 06:32:46 evolution-addre +06:20:31 root 5857 0.2 2.16 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell +06:20:31 root 186 0.1 0.0 0 0 ? I 00:00:00 06:32:21 kworker/3:2-events +06:20:31 root 1106 0.1 0.14 396836 20496 ? S 00:00:00 06:32:24 NetworkManager +06:20:31 root 1120 0.1 0.23 483856 32504 ? S 00:00:02 06:32:24 tuned +06:20:31 root 1650 0.1 0.06 100884 8848 ? R 00:00:00 06:32:25 pmdaproc +06:20:31 root 1682 0.1 0.06 99880 8004 ? S 00:00:00 06:32:25 pmdalinux +06:20:31 root 5766 0.1 0.05 76556 6756 ? S 00:00:00 06:32:44 dbus-daemon +06:20:31 root 6254 0.1 0.21 788224 30540 tty2 S 00:00:00 06:32:45 tracker-miner-f pcp-ps output : Display the value as per %mem sorted Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:31 root 4978 0.0 0.0 858384 320344 ? S 00:00:05 06:32:28 packagekitd -06:20:31 root 5857 0.2 0.8 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell -06:20:31 root 6224 0.0 0.0 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software -06:20:31 root 5976 0.0 0.0 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 -06:20:31 root 5916 0.0 0.0 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland -06:20:31 root 6219 0.0 0.1 770024 50580 ? S 00:00:00 06:32:45 tracker-store -06:20:31 root 6834 0.0 0.0 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- -06:20:31 root 897 0.0 0.0 198164 44248 ? S 00:00:00 06:32:24 sssd_nss +06:20:31 root 4978 0.0 2.25 858384 320344 ? S 00:00:05 06:32:28 packagekitd +06:20:31 root 5857 0.2 2.16 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell +06:20:31 root 6224 0.0 1.01 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software +06:20:31 root 5976 0.0 0.45 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 +06:20:31 root 5916 0.0 0.37 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland +06:20:31 root 6219 0.0 0.36 770024 50580 ? S 00:00:00 06:32:45 tracker-store +06:20:31 root 6834 0.0 0.35 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- +06:20:31 root 884 0.0 0.31 308900 43444 ? S 00:00:00 06:32:24 firewalld pcp-ps output : Display user format with sort by %mem Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp USERNAME PID %CPU %MEM VSZ RSS TTY STAT TIME START COMMAND -06:20:31 root 4978 0.0 0.0 858384 320344 ? S 00:00:05 06:32:28 packagekitd -06:20:31 root 5857 0.2 0.8 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell -06:20:31 root 6224 0.0 0.0 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software -06:20:31 root 5976 0.0 0.0 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 -06:20:31 root 5916 0.0 0.0 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland -06:20:31 root 6219 0.0 0.1 770024 50580 ? S 00:00:00 06:32:45 tracker-store -06:20:31 root 6834 0.0 0.0 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- -06:20:31 root 897 0.0 0.0 198164 44248 ? S 00:00:00 06:32:24 sssd_nss +06:20:31 root 4978 0.0 2.25 858384 320344 ? S 00:00:05 06:32:28 packagekitd +06:20:31 root 5857 0.2 2.16 4157608 307268 tty2 S 00:00:07 06:32:44 gnome-shell +06:20:31 root 6224 0.0 1.01 1171516 143284 tty2 S 00:00:01 06:32:45 gnome-software +06:20:31 root 5976 0.0 0.45 546088 64308 tty2 S 00:00:00 06:32:44 ibus-x11 +06:20:31 root 5916 0.0 0.37 269868 52816 tty2 S 00:00:00 06:32:44 Xwayland +06:20:31 root 6219 0.0 0.36 770024 50580 ? S 00:00:00 06:32:45 tracker-store +06:20:31 root 6834 0.0 0.35 537140 49588 ? S 00:00:00 06:32:55 gnome-terminal- +06:20:31 root 884 0.0 0.31 308900 43444 ? S 00:00:00 06:32:24 firewalld pcp-ps output : Display the value as per %mem in user selected format Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp PID PPID TTY Command %MEM -06:20:31 1 0 ? /usr/lib/systemd/systemd --swi 0.1 -06:20:31 786 1 ? /usr/bin/rpcbind -w -f 0.04 -06:20:31 816 1 ? /usr/sbin/mcelog --ignorenodev 0.01 -06:20:31 818 1 ? /usr/bin/dbus-daemon --system 0.06 -06:20:31 820 1 ? /usr/lib/polkit-1/polkitd --no 0.19 -06:20:31 821 1 ? /usr/sbin/irqbalance --foregro 0.03 -06:20:31 827 1 ? /usr/sbin/alsactl -s -n 19 -c 0.01 -06:20:31 829 1 ? avahi-daemon: running [linux.l 0.04 +06:20:31 4978 1 ? /usr/libexec/packagekitd 2.25 +06:20:31 5857 5769 tty2 /usr/bin/gnome-shell 2.16 +06:20:31 6224 5769 tty2 /usr/bin/gnome-software --gapp 1.01 +06:20:31 5976 1 tty2 /usr/libexec/ibus-x11 --kill-d 0.45 +06:20:31 5916 5857 tty2 /usr/bin/Xwayland :0 -rootless 0.37 +06:20:31 6219 5729 ? /usr/libexec/tracker-store 0.36 +06:20:31 6834 5729 ? /usr/libexec/gnome-terminal-se 0.35 +06:20:31 884 1 ? /usr/libexec/platform-python - 0.31 pcp-ps output : Display the value as per %cpu in user selected format Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) -Timestamp USER PID PPID PRI %CPU %MEM VSZ RSS S STARTED TIME WCHAN Command -06:20:31 root 4978 1 0 0.0 0.0 858384 320344 S 06:32:28 00:00:05 poll_schedule_timeout.constpro /usr/libexec/packagekitd -06:20:31 root 5857 5769 0 0.8 0.2 4157608 307268 S 06:32:44 00:00:07 poll_schedule_timeout.constpro /usr/bin/gnome-shell -06:20:31 root 6224 5769 0 0.0 0.0 1171516 143284 S 06:32:45 00:00:01 poll_schedule_timeout.constpro /usr/bin/gnome-software --gapplication-servic -06:20:31 root 5976 1 0 0.0 0.0 546088 64308 S 06:32:44 00:00:00 poll_schedule_timeout.constpro /usr/libexec/ibus-x11 --kill-daemon -06:20:31 root 5916 5857 0 0.0 0.0 269868 52816 S 06:32:44 00:00:00 ep_poll /usr/bin/Xwayland :0 -rootless -terminate -ac -06:20:31 root 6219 5729 0 0.1 0.0 770024 50580 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/tracker-store -06:20:31 root 6834 5729 0 0.0 0.0 537140 49588 S 06:32:55 00:00:00 poll_schedule_timeout.constpro /usr/libexec/gnome-terminal-server -06:20:31 root 897 838 0 0.0 0.0 198164 44248 S 06:32:24 00:00:00 ep_poll /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 -- +Timestamp USER PID PPID PRI %CPU %MEM VSZ RSS S START TIME WCHAN Command +06:20:31 root 5857 5769 0 0.2 2.16 4157608 307268 S 06:32:44 00:00:07 poll_schedule_timeout.constpro /usr/bin/gnome-shell +06:20:31 root 186 2 0 0.1 0.0 0 0 I 06:32:21 00:00:00 worker_thread (kworker/3:2-cgroup_pidlist_destroy) +06:20:31 root 1106 1 0 0.1 0.14 396836 20496 S 06:32:24 00:00:00 poll_schedule_timeout.constpro /usr/sbin/NetworkManager --no-daemon +06:20:31 root 1120 1 0 0.1 0.23 483856 32504 S 06:32:24 00:00:02 poll_schedule_timeout.constpro /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P +06:20:31 root 1650 1633 0 0.1 0.06 100884 8848 R 06:32:25 00:00:00 - /var/lib/pcp/pmdas/proc/pmdaproc -A -d 3 +06:20:31 root 1682 1633 0 0.1 0.06 99880 8004 S 06:32:25 00:00:00 pipe_wait /var/lib/pcp/pmdas/linux/pmdalinux -A +06:20:31 root 5766 5729 0 0.1 0.05 76556 6756 S 06:32:44 00:00:00 ep_poll /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only +06:20:31 root 6254 5769 0 0.1 0.21 788224 30540 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/tracker-miner-fs pcp-ps output : Display user format with explicit columns sorted by %cpu Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) @@ -23075,70 +23075,70 @@ Timestamp PID USER %CPU %MEM VSZ RSS TTY S TIME START pcp-ps output : Display user format with args column sorted by %mem Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp PID USER Command %CPU %MEM VSZ RSS TTY S TIME START -06:20:31 786 rpc /usr/bin/rpcbind -w -f 0.0 0.04 67240 5496 ? S 00:00:00 06:32:24 -06:20:31 827 root /usr/sbin/alsactl -s -n 19 -c 0.0 0.01 17540 1568 ? S 00:00:00 06:32:24 -06:20:31 829 avahi avahi-daemon: running [linux.l 0.0 0.04 69548 5068 ? S 00:00:00 06:32:24 -06:20:31 838 root /usr/sbin/sssd -i --logger=fil 0.0 0.08 183488 11484 ? S 00:00:00 06:32:24 -06:20:31 840 root /usr/sbin/smartd -n -q never 0.0 0.04 50696 5992 ? S 00:00:00 06:32:24 -06:20:31 868 avahi avahi-daemon: chroot helper 0.0 0.0 69424 440 ? S 00:00:00 06:32:24 -06:20:31 1117 root /usr/sbin/sshd -D -oCiphers=ae 0.0 0.05 76640 7052 ? S 00:00:00 06:32:24 -06:20:31 1150 root /usr/sbin/iscsid -f -d2 0.0 0.09 57392 12296 ? S 00:00:00 06:32:25 -06:20:31 2501 pcp /usr/bin/pmie -b -F -P -l /var 0.0 0.05 97144 7340 ? S 00:00:00 06:32:26 -06:20:31 4977 root /usr/sbin/wpa_supplicant -c /e 0.0 0.05 61332 6668 ? S 00:00:00 06:32:28 +06:20:31 4978 root /usr/libexec/packagekitd 0.0 2.25 858384 320344 ? S 00:00:05 06:32:28 +06:20:31 5857 root /usr/bin/gnome-shell 0.2 2.16 4157608 307268 tty2 S 00:00:07 06:32:44 +06:20:31 6224 root /usr/bin/gnome-software --gapp 0.0 1.01 1171516 143284 tty2 S 00:00:01 06:32:45 +06:20:31 5976 root /usr/libexec/ibus-x11 --kill-d 0.0 0.45 546088 64308 tty2 S 00:00:00 06:32:44 06:20:31 5916 root /usr/bin/Xwayland :0 -rootless 0.0 0.37 269868 52816 tty2 S 00:00:00 06:32:44 -06:20:31 5963 root ibus-daemon --xim --panel disa 0.0 0.09 453812 13192 tty2 S 00:00:00 06:32:44 -06:20:31 6343 root 0.0 0.01 94116 1252 ? S 00:00:00 06:32:46 +06:20:31 6219 root /usr/libexec/tracker-store 0.0 0.36 770024 50580 ? S 00:00:00 06:32:45 +06:20:31 6834 root /usr/libexec/gnome-terminal-se 0.0 0.35 537140 49588 ? S 00:00:00 06:32:55 +06:20:31 884 root /usr/libexec/platform-python - 0.0 0.31 308900 43444 ? S 00:00:00 06:32:24 +06:20:31 897 root /usr/libexec/sssd/sssd_nss --u 0.0 0.31 198164 44248 ? S 00:00:00 06:32:24 +06:20:31 6055 root /usr/libexec/sssd/sssd_kcm --u 0.0 0.28 191080 40088 ? S 00:00:00 06:32:45 +06:20:31 6005 root /usr/libexec/goa-daemon 0.0 0.26 836252 36364 ? S 00:00:00 06:32:45 +06:20:31 864 root /opt/cisco/anyconnect/bin/vpna 0.0 0.23 447888 32184 ? S 00:00:00 06:32:24 +06:20:31 1120 root /usr/libexec/platform-python - 0.1 0.23 483856 32504 ? S 00:00:02 06:32:24 pcp-ps output : Display user format with args column sorted by %cpu Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) Timestamp PID USER Command %CPU %MEM VSZ RSS TTY S TIME START +06:20:31 5857 root /usr/bin/gnome-shell 0.2 2.16 4157608 307268 tty2 S 00:00:07 06:32:44 +06:20:31 186 root (kworker/3:2-cgroup_pidlist_de 0.1 0.0 0 0 ? I 00:00:00 06:32:21 +06:20:31 1106 root /usr/sbin/NetworkManager --no- 0.1 0.14 396836 20496 ? S 00:00:00 06:32:24 +06:20:31 1120 root /usr/libexec/platform-python - 0.1 0.23 483856 32504 ? S 00:00:02 06:32:24 +06:20:31 1650 root /var/lib/pcp/pmdas/proc/pmdapr 0.1 0.06 100884 8848 ? R 00:00:00 06:32:25 +06:20:31 1682 root /var/lib/pcp/pmdas/linux/pmdal 0.1 0.06 99880 8004 ? S 00:00:00 06:32:25 +06:20:31 5766 root /usr/bin/dbus-daemon --session 0.1 0.05 76556 6756 ? S 00:00:00 06:32:44 +06:20:31 6254 root /usr/libexec/tracker-miner-fs 0.1 0.21 788224 30540 tty2 S 00:00:00 06:32:45 +06:20:31 6335 root /usr/bin/VBoxClient --dragandd 0.1 0.02 250248 2720 ? S 00:00:00 06:32:46 +06:20:31 9349 root /usr/libexec/tracker-extract 0.1 0.15 1173832 20680 ? R 00:00:00 06:37:42 06:20:31 1 root /usr/lib/systemd/systemd --swi 0.0 0.1 241324 14332 ? S 00:00:01 06:32:20 -06:20:31 786 rpc /usr/bin/rpcbind -w -f 0.0 0.04 67240 5496 ? S 00:00:00 06:32:24 -06:20:31 816 root /usr/sbin/mcelog --ignorenodev 0.0 0.01 7172 1940 ? S 00:00:00 06:32:24 -06:20:31 818 dbus /usr/bin/dbus-daemon --system 0.0 0.06 67416 8124 ? S 00:00:00 06:32:24 -06:20:31 820 polkitd /usr/lib/polkit-1/polkitd --no 0.0 0.19 1759272 26660 ? S 00:00:00 06:32:24 -06:20:31 821 root /usr/sbin/irqbalance --foregro 0.0 0.03 124900 4920 ? S 00:00:00 06:32:24 -06:20:31 827 root /usr/sbin/alsactl -s -n 19 -c 0.0 0.01 17540 1568 ? S 00:00:00 06:32:24 -06:20:31 829 avahi avahi-daemon: running [linux.l 0.0 0.04 69548 5068 ? S 00:00:00 06:32:24 -06:20:31 830 libstorage /usr/bin/lsmd -d 0.0 0.01 8612 1860 ? S 00:00:00 06:32:24 -06:20:31 838 root /usr/sbin/sssd -i --logger=fil 0.0 0.08 183488 11484 ? S 00:00:00 06:32:24 -06:20:31 840 root /usr/sbin/smartd -n -q never 0.0 0.04 50696 5992 ? S 00:00:00 06:32:24 -06:20:31 860 root /bin/bash /usr/sbin/ksmtuned 0.0 0.02 15500 2776 ? S 00:00:00 06:32:24 -06:20:31 868 avahi avahi-daemon: chroot helper 0.0 0.0 69424 440 ? S 00:00:00 06:32:24 +06:20:31 2 root (kthreadd) 0.0 0.0 0 0 ? S 00:00:00 06:32:20 +06:20:31 3 root (rcu_gp) 0.0 0.0 0 0 ? I 00:00:00 06:32:20 pcp-ps output : Display ALL columns sorted by %mem Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) -Timestamp USER PID PPID PRI %CPU %MEM VSZ RSS S STARTED TIME WCHAN Command -06:20:31 root 5857 5769 0 0.8 0.2 4157608 307268 S 06:32:44 00:00:07 poll_schedule_timeout.constpro /usr/bin/gnome-shell -06:20:31 polkitd 820 1 0 0.0 0.0 1759272 26660 S 06:32:24 00:00:00 poll_schedule_timeout.constpro /usr/lib/polkit-1/polkitd --no-debug -06:20:31 root 6243 5769 0 0.0 0.0 1229252 25848 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/tracker-miner-apps -06:20:31 root 6188 6085 0 0.0 0.0 1189836 33212 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/evolution-calendar-factory-subpr -06:20:31 root 9349 5729 0 0.7 0.1 1173832 20680 R 06:37:42 00:00:00 - /usr/libexec/tracker-extract -06:20:31 root 6115 1 0 0.0 0.0 1172012 13208 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/bin/pulseaudio --start -06:20:31 root 6224 5769 0 0.0 0.0 1171516 143284 S 06:32:45 00:00:01 poll_schedule_timeout.constpro /usr/bin/gnome-software --gapplication-servic -06:20:31 root 6294 6216 0 0.0 0.0 1109452 32004 S 06:32:46 00:00:00 poll_schedule_timeout.constpro /usr/libexec/evolution-addressbook-factory-su -06:20:31 root 6138 5769 0 0.0 0.0 898984 27208 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/gsd-media-keys -06:20:31 root 4978 1 0 0.0 0.0 858384 320344 S 06:32:28 00:00:05 poll_schedule_timeout.constpro /usr/libexec/packagekitd -06:20:31 root 6085 5729 0 0.0 0.0 840368 31632 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/evolution-calendar-factory -06:20:31 root 6005 5729 0 0.0 0.0 836252 36364 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/goa-daemon -06:20:31 root 6216 5729 0 0.0 0.0 827040 31152 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/evolution-addressbook-factory +Timestamp USER PID PPID PRI %CPU %MEM VSZ RSS S START TIME WCHAN Command +06:20:31 root 4978 1 0 0.0 2.25 858384 320344 S 06:32:28 00:00:05 poll_schedule_timeout.constpro /usr/libexec/packagekitd +06:20:31 root 5857 5769 0 0.2 2.16 4157608 307268 S 06:32:44 00:00:07 poll_schedule_timeout.constpro /usr/bin/gnome-shell +06:20:31 root 6224 5769 0 0.0 1.01 1171516 143284 S 06:32:45 00:00:01 poll_schedule_timeout.constpro /usr/bin/gnome-software --gapplication-service +06:20:31 root 5976 1 0 0.0 0.45 546088 64308 S 06:32:44 00:00:00 poll_schedule_timeout.constpro /usr/libexec/ibus-x11 --kill-daemon +06:20:31 root 5916 5857 0 0.0 0.37 269868 52816 S 06:32:44 00:00:00 ep_poll /usr/bin/Xwayland :0 -rootless -terminate -accessx -core -auth /run/user/0/.mutter-Xwaylandauth.Q6AEX1 -listen 4 -listen 5 -displayfd 6 +06:20:31 root 6219 5729 0 0.0 0.36 770024 50580 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/tracker-store +06:20:31 root 6834 5729 0 0.0 0.35 537140 49588 S 06:32:55 00:00:00 poll_schedule_timeout.constpro /usr/libexec/gnome-terminal-server +06:20:31 root 884 1 0 0.0 0.31 308900 43444 S 06:32:24 00:00:00 poll_schedule_timeout.constpro /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid +06:20:31 root 897 838 0 0.0 0.31 198164 44248 S 06:32:24 00:00:00 ep_poll /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files +06:20:31 root 6055 1 0 0.0 0.28 191080 40088 S 06:32:45 00:00:00 ep_poll /usr/libexec/sssd/sssd_kcm --uid 0 --gid 0 --logger=files +06:20:31 root 6005 5729 0 0.0 0.26 836252 36364 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/goa-daemon +06:20:31 root 864 1 0 0.0 0.23 447888 32184 S 06:32:24 00:00:00 futex_wait_queue_me /opt/cisco/anyconnect/bin/vpnagentd -execv_instance +06:20:31 root 1120 1 0 0.1 0.23 483856 32504 S 06:32:24 00:00:02 poll_schedule_timeout.constpro /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P pcp-ps output : Display ALL columns sorted by %cpu Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) -Timestamp USER PID PPID PRI %CPU %MEM VSZ RSS S STARTED TIME WCHAN Command -06:20:31 root 4978 1 0 0.0 0.0 858384 320344 S 06:32:28 00:00:05 poll_schedule_timeout.constpro /usr/libexec/packagekitd -06:20:31 root 5857 5769 0 0.8 0.2 4157608 307268 S 06:32:44 00:00:07 poll_schedule_timeout.constpro /usr/bin/gnome-shell -06:20:31 root 6224 5769 0 0.0 0.0 1171516 143284 S 06:32:45 00:00:01 poll_schedule_timeout.constpro /usr/bin/gnome-software --gapplication-servic -06:20:31 root 5976 1 0 0.0 0.0 546088 64308 S 06:32:44 00:00:00 poll_schedule_timeout.constpro /usr/libexec/ibus-x11 --kill-daemon -06:20:31 root 5916 5857 0 0.0 0.0 269868 52816 S 06:32:44 00:00:00 ep_poll /usr/bin/Xwayland :0 -rootless -terminate -ac -06:20:31 root 6219 5729 0 0.1 0.0 770024 50580 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/tracker-store -06:20:31 root 6834 5729 0 0.0 0.0 537140 49588 S 06:32:55 00:00:00 poll_schedule_timeout.constpro /usr/libexec/gnome-terminal-server -06:20:31 root 897 838 0 0.0 0.0 198164 44248 S 06:32:24 00:00:00 ep_poll /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 -- -06:20:31 root 884 1 0 0.0 0.0 308900 43444 S 06:32:24 00:00:00 poll_schedule_timeout.constpro /usr/libexec/platform-python -s /usr/sbin/fir -06:20:31 root 6055 1 0 0.1 0.0 191080 40088 S 06:32:45 00:00:00 ep_poll /usr/libexec/sssd/sssd_kcm --uid 0 --gid 0 -- -06:20:31 root 6005 5729 0 0.0 0.0 836252 36364 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/goa-daemon -06:20:31 root 6188 6085 0 0.0 0.0 1189836 33212 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/evolution-calendar-factory-subpr -06:20:31 root 1120 1 0 0.4 0.1 483856 32504 S 06:32:24 00:00:02 poll_schedule_timeout.constpro /usr/libexec/platform-python -Es /usr/sbin/tu +Timestamp USER PID PPID PRI %CPU %MEM VSZ RSS S START TIME WCHAN Command +06:20:31 root 5857 5769 0 0.2 2.16 4157608 307268 S 06:32:44 00:00:07 poll_schedule_timeout.constpro /usr/bin/gnome-shell +06:20:31 root 186 2 0 0.1 0.0 0 0 I 06:32:21 00:00:00 worker_thread (kworker/3:2-cgroup_pidlist_destroy) +06:20:31 root 1106 1 0 0.1 0.14 396836 20496 S 06:32:24 00:00:00 poll_schedule_timeout.constpro /usr/sbin/NetworkManager --no-daemon +06:20:31 root 1120 1 0 0.1 0.23 483856 32504 S 06:32:24 00:00:02 poll_schedule_timeout.constpro /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P +06:20:31 root 1650 1633 0 0.1 0.06 100884 8848 R 06:32:25 00:00:00 - /var/lib/pcp/pmdas/proc/pmdaproc -A -d 3 +06:20:31 root 1682 1633 0 0.1 0.06 99880 8004 S 06:32:25 00:00:00 pipe_wait /var/lib/pcp/pmdas/linux/pmdalinux -A +06:20:31 root 5766 5729 0 0.1 0.05 76556 6756 S 06:32:44 00:00:00 ep_poll /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only +06:20:31 root 6254 5769 0 0.1 0.21 788224 30540 S 06:32:45 00:00:00 poll_schedule_timeout.constpro /usr/libexec/tracker-miner-fs +06:20:31 root 6335 6334 0 0.1 0.02 250248 2720 S 06:32:46 00:00:00 futex_wait_queue_me /usr/bin/VBoxClient --draganddrop +06:20:31 root 9349 5729 0 0.1 0.15 1173832 20680 R 06:37:42 00:00:00 - /usr/libexec/tracker-extract +06:20:31 root 1 0 0 0.0 0.1 241324 14332 S 06:32:20 00:00:01 ep_poll /usr/lib/systemd/systemd --switched-root --system --deserialize 18 +06:20:31 root 2 0 0 0.0 0.0 0 0 S 06:32:20 00:00:00 kthreadd (kthreadd) +06:20:31 root 3 2 0 0.0 0.0 0 0 I 06:32:20 00:00:00 rescuer_thread (rcu_gp) pcp-ps output : Display user format with sort by %cpu (custom columns, positive test) Linux 5.4.17-2136.313.6.el8uek.x86_64 (localhost.localdomain) 12/14/22 x86_64 (4 CPU) From a7d542c7927f536510770c2e20dc30d8f6179ec2 Mon Sep 17 00:00:00 2001 From: Pradyumn Rahar Date: Thu, 19 Mar 2026 10:59:10 +0530 Subject: [PATCH 13/31] pmda/rds: move RDS domain number to fill empty slots Signed-off-by: Pradyumn Rahar --- src/pmdas/rds/Install | 2 +- src/pmdas/rds/domain.h | 2 +- src/pmdas/rds/pmdards.python | 2 +- src/pmdas/rds/pmns | 2 +- src/pmns/stdpmid.pcp | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pmdas/rds/Install b/src/pmdas/rds/Install index b86e986ad92..7cdaa8783e9 100755 --- a/src/pmdas/rds/Install +++ b/src/pmdas/rds/Install @@ -18,7 +18,7 @@ . $PCP_SHARE_DIR/lib/pmdaproc.sh iam=rds -domain=255 +domain=37 python_opt=true daemon_opt=false diff --git a/src/pmdas/rds/domain.h b/src/pmdas/rds/domain.h index c57ad897123..24fb16dbd9c 100644 --- a/src/pmdas/rds/domain.h +++ b/src/pmdas/rds/domain.h @@ -1 +1 @@ -#define RDS 255 +#define RDS 37 diff --git a/src/pmdas/rds/pmdards.python b/src/pmdas/rds/pmdards.python index 14e49feac80..fbd6259a4ac 100755 --- a/src/pmdas/rds/pmdards.python +++ b/src/pmdas/rds/pmdards.python @@ -436,7 +436,7 @@ if __name__ == "__main__": # This PMDA starts up in the "notready" state, see the Install script where # the IPC protocol is ipc_prot="binary notready". See also pmcd(1) man page. # The "binary notready" setting can also be manually configured in pmcd.conf. - pmda = RDSPMDA(name='rds', domain=255, user="root", logfile='rds.log') + pmda = RDSPMDA(name='rds', domain=37, user="root", logfile='rds.log') pmda.pmda_ready() if not pmda.in_pmda_setup(): diff --git a/src/pmdas/rds/pmns b/src/pmdas/rds/pmns index 6b8c3a3d19d..438422f6a25 100644 --- a/src/pmdas/rds/pmns +++ b/src/pmdas/rds/pmns @@ -1 +1 @@ -rds 255:*:* +rds 37:*:* diff --git a/src/pmns/stdpmid.pcp b/src/pmns/stdpmid.pcp index a82812c2012..6b743c9c359 100644 --- a/src/pmns/stdpmid.pcp +++ b/src/pmns/stdpmid.pcp @@ -37,6 +37,7 @@ PODMAN 33 POWER 34 MONGODB 35 VALKEY 36 +RDS 37 ### FREE SLOTS (up to 55) ### SNMP 56 STATSD 57 @@ -163,8 +164,7 @@ QA_TEST_PERL 252 SIMPLE 253 MEMORY_PYTHON 254 # end QA section -RDS 255 -### MORE FREE SLOTS 256..510 ### +### MORE FREE SLOTS 255..510 ### # # 511 is REALLY reserved ... see DYNAMIC_PMID in libpcp.h # From 05a2c6724675ce255bed1dd7c265f192e122dfc1 Mon Sep 17 00:00:00 2001 From: Nathan Scott Date: Thu, 19 Mar 2026 18:11:58 +1100 Subject: [PATCH 14/31] pmcd, pmproxy: ensure pmcd.services metric functions on macOS Refactor the start scripts a little to make pmproxy create a pidfile which is the missing ingredient for the pmcd.services metric search. Without this the pcp(1) command doesn't detect a running pmproxy(1). Its a little nicer too in terms of integrating with the scripts more like other init-replacement systems, using a custom option insted of a custom env variable. This reconciles some differences between pmcd and pmproxy in terms of handling the -F/--systemd (now --managed) command line option. --- build/mac/io.pcp.pmcd.plist | 7 +------ build/mac/io.pcp.pmproxy.plist | 7 +------ build/mac/qa/TESTING.md | 17 +++++++---------- build/mac/qa/test-pmcd-launchctl.sh | 21 +++++++-------------- man/man1/pmcd.1 | 13 ++++++++++++- man/man1/pmproxy.1 | 6 +++++- src/pmcd/rc_pmcd | 16 ++++++++-------- src/pmcd/src/pmcd.c | 12 ++++++++++-- src/pmproxy/rc_pmproxy | 18 ++++++++---------- src/pmproxy/src/pmproxy.c | 8 ++++---- src/zshrc/_pcp | 2 +- 11 files changed, 64 insertions(+), 63 deletions(-) diff --git a/build/mac/io.pcp.pmcd.plist b/build/mac/io.pcp.pmcd.plist index c08f4643d99..7a8a946a9ab 100644 --- a/build/mac/io.pcp.pmcd.plist +++ b/build/mac/io.pcp.pmcd.plist @@ -7,13 +7,8 @@ ProgramArguments /etc/init.d/pmcd - start + start-launchd - EnvironmentVariables - - LAUNCHED_BY_LAUNCHD - 1 - Disabled UserName diff --git a/build/mac/io.pcp.pmproxy.plist b/build/mac/io.pcp.pmproxy.plist index 7f79165b540..f3b2b650d6b 100644 --- a/build/mac/io.pcp.pmproxy.plist +++ b/build/mac/io.pcp.pmproxy.plist @@ -7,13 +7,8 @@ ProgramArguments /etc/init.d/pmproxy - start + start-launchd - EnvironmentVariables - - LAUNCHED_BY_LAUNCHD - 1 - Disabled UserName diff --git a/build/mac/qa/TESTING.md b/build/mac/qa/TESTING.md index c7bf8461d85..e7b41e9bfd9 100644 --- a/build/mac/qa/TESTING.md +++ b/build/mac/qa/TESTING.md @@ -58,10 +58,7 @@ wait_pmcd() { ### Test 1: Verify Configuration Changes ```bash -# Check plist has environment variable and KeepAlive -cat /Library/LaunchDaemons/io.pcp.pmcd.plist | grep -A4 EnvironmentVariables -# Should show: LAUNCHED_BY_LAUNCHD = 1 - +# Check plist has KeepAlive cat /Library/LaunchDaemons/io.pcp.pmcd.plist | grep -A1 KeepAlive # Should show: ``` @@ -87,9 +84,9 @@ wait_pmcd # Verify pmcd is running ps aux | grep pmcd | grep -v grep -# Check that pmcd is running with -f flag (foreground mode) -ps aux | grep '[p]mcd' | grep -- '-f' -# Should see the -f flag in the command line +# Check that pmcd is running with -F flag (foreground mode) +ps aux | grep '[p]mcd' | grep -- '-F' +# Should see the -F flag in the command line # Verify exactly one pmcd process (no fork issues) echo "pmcd process count: $(ps aux | grep '[p]mcd' | wc -l | tr -d ' ')" @@ -202,8 +199,8 @@ pminfo -f pmcd.version ## Expected Results Summary -✅ **Configuration**: LAUNCHED_BY_LAUNCHD env var present, KeepAlive = true -✅ **Foreground mode**: pmcd runs with `-f` flag +✅ **Configuration**: KeepAlive = true +✅ **Foreground mode**: pmcd runs with `-F` flag ✅ **No fork issues**: Only one pmcd process exists ✅ **launchctl tracking**: Service shows in `launchctl list` with PID ✅ **KeepAlive works**: pmcd automatically restarts after crash @@ -240,5 +237,5 @@ Check if rc_pmcd is detecting it: sudo launchctl unload /Library/LaunchDaemons/io.pcp.pmcd.plist sudo launchctl load /Library/LaunchDaemons/io.pcp.pmcd.plist wait_pmcd -ps aux | grep '[p]mcd' # Should show -f flag +ps aux | grep '[p]mcd' # Should show -F flag ``` diff --git a/build/mac/qa/test-pmcd-launchctl.sh b/build/mac/qa/test-pmcd-launchctl.sh index 03cf8239a31..fc599d3c4b8 100755 --- a/build/mac/qa/test-pmcd-launchctl.sh +++ b/build/mac/qa/test-pmcd-launchctl.sh @@ -88,13 +88,6 @@ if [ ! -f "$PLIST_PATH" ]; then exit 1 fi -if grep -q "LAUNCHED_BY_LAUNCHD" "$PLIST_PATH"; then - echo "✓ LAUNCHED_BY_LAUNCHD environment variable present" -else - echo "✗ LAUNCHED_BY_LAUNCHD environment variable missing" - exit 1 -fi - if grep -A1 "KeepAlive" "$PLIST_PATH" | grep -q ""; then echo "✓ KeepAlive enabled" else @@ -137,13 +130,13 @@ else exit 1 fi -# Test 3: Verify foreground mode -echo -e "\n[Test 3] Verifying foreground mode..." +# Test 3: Verify managed mode +echo -e "\n[Test 3] Verifying managed mode..." -if ps aux | grep '[p]mcd' | grep -q -- '-f'; then - echo "✓ pmcd running in foreground mode (-f flag present)" +if ps aux | grep '[p]mcd' | grep -q -- '-F'; then + echo "✓ pmcd running in managed mode (-F flag present)" else - echo "⚠ Warning: pmcd not running with -f flag" + echo "⚠ Warning: pmcd not running with -F flag" echo "Command line: $(ps aux | grep '[p]mcd')" fi @@ -303,8 +296,8 @@ fi echo -e "\n=== All tests passed! ===" echo "" echo "Summary:" -echo " ✓ Configuration correct (LAUNCHED_BY_LAUNCHD + KeepAlive)" -echo " ✓ pmcd runs in foreground mode (-f flag)" +echo " ✓ Configuration correct (KeepAlive)" +echo " ✓ pmcd runs in managed mode (-F flag)" echo " ✓ No fork issues (single pmcd process)" echo " ✓ launchctl properly tracks pmcd" echo " ✓ pmcd responds to queries" diff --git a/man/man1/pmcd.1 b/man/man1/pmcd.1 index a4e4b4de9f5..7db6eb5402b 100644 --- a/man/man1/pmcd.1 +++ b/man/man1/pmcd.1 @@ -19,7 +19,7 @@ \f3pmcd\f1 \- performance metrics collector daemon .SH SYNOPSIS \f3pmcd\f1 -[\f3\-AfQSv?\f1] +[\f3\-AfFQSv?\f1] [\f3\-c\f1 \f2config\f1] [\f3\-C\f1 \f2nctx\f1] [\f3\-D\f1 \f2debug\f1] @@ -137,6 +137,17 @@ option indicates that it should run in the foreground. This is most useful when trying to diagnose problems with misbehaving agents. .TP +\f3\-F\f1, \f3\-\-managed\f1 +By default +.B pmcd +is started as a daemon. +The +.B \-F +option indicates that it will be managed by a system service like +.BR launchd (1). +or +.BR systemd (1) +.TP \f3\-H\f1 \f2hostname\f1, \f3\-\-hostname\f1=\f2hostname\f1 This option can be used to set the hostname that .B pmcd diff --git a/man/man1/pmproxy.1 b/man/man1/pmproxy.1 index 43ae39ef9c7..8381a3022b6 100644 --- a/man/man1/pmproxy.1 +++ b/man/man1/pmproxy.1 @@ -137,7 +137,7 @@ option indicates that it should run in the foreground. This is most useful when trying to diagnose problems with establishing connections. .TP -\f3\-F\f1, \f3\-\-systemd\f1 +\f3\-F\f1, \f3\-\-managed\f1 Like .BR \-f , the @@ -149,8 +149,12 @@ in the foreground, but also does some housekeeping (like create a .B pmproxy is launched from .BR systemd (1) +or +.BR launchd (1) and the daemonising has already been done by .BR systemd (1) +or +.BR launchd (1) and does not need to be done again by .BR pmproxy , which is the case when neither diff --git a/src/pmcd/rc_pmcd b/src/pmcd/rc_pmcd index 3338b7c58a8..2f3dd0a24cc 100644 --- a/src/pmcd/rc_pmcd +++ b/src/pmcd/rc_pmcd @@ -44,7 +44,7 @@ . $PCP_DIR/etc/pcp.env . $PCP_SHARE_DIR/lib/rc-proc.sh -# for chasing arguments we're passed from init/systemd/... +# for chasing arguments we're passed from init/systemd/launchd/... # #debug# echo "$*: `date`" >>$PCP_LOG_DIR/rc_pmcd.log #debug# env >>$PCP_LOG_DIR/rc_pmcd.log @@ -505,7 +505,7 @@ Warning: process ID in $PCP_RUN_DIR/pmcd.pid ($runpid) is different. _usage() { - echo "Usage: $prog [-v] {start|start-systemd|faststart|restart|condrestart|stop|stop-systemd|status|reload|force-reload}" + echo "Usage: $prog [-v] {start|start-launchd|start-systemd|faststart|restart|condrestart|stop|stop-launchd|stop-systemd|status|reload|force-reload}" } VERBOSE_CTL=on @@ -566,7 +566,7 @@ $RC_RESET # considered a success. case "$1" in - start|start-systemd|faststart|restart|condrestart|reload|force-reload) + start|start-systemd|start-launchd|faststart|restart|condrestart|reload|force-reload) if [ "$1" = "condrestart" ] && ! is_chkconfig_on pmcd then status=0 @@ -598,7 +598,7 @@ Error: pmcd log directory $PCP_LOG_DIR/pmcd ("'"$LOGDIR"'") is missing, cannot s fi cd "$LOGDIR" - [ "$1" = "start-systemd" ] ||\ + [ "$1" = "start-systemd" -o "$1" = "start-launchd" ] ||\ $ECHO $PCP_ECHO_N "Starting pmcd ..." "$PCP_ECHO_C" # only consider variables which start with PMCD or PCP @@ -621,8 +621,8 @@ Error: pmcd log directory $PCP_LOG_DIR/pmcd ("'"$LOGDIR"'") is missing, cannot s echo $prog: pmcd --verify $OPTS failed, cannot start pmcd. exit fi - # When launched by launchctl on macOS, run in foreground mode - [ -n "$LAUNCHED_BY_LAUNCHD" ] && OPTS="$OPTS -f" + # on macOS under launchd run in "managed" mode + [ "$1" = "start-launchd" ] && OPTS="$OPTS -F" $PMCD $OPTS _start_pmcheck $RC_STATUS -v @@ -654,11 +654,11 @@ Error: pmcd log directory $PCP_LOG_DIR/pmcd ("'"$LOGDIR"'") is missing, cannot s status=0 ;; - stop|stop-systemd) + stop|stop-systemd|stop-launchd) # site-local customisations before pmcd shutdown # [ -x $PCPLOCAL ] && $PCPLOCAL $VFLAG stop - if [ "$1" = stop-systemd ] + if [ "$1" = stop-systemd -o "$1" = stop-launchd ] then _shutdown quietly else diff --git a/src/pmcd/src/pmcd.c b/src/pmcd/src/pmcd.c index fbffdcbd6c0..b6801b059af 100644 --- a/src/pmcd/src/pmcd.c +++ b/src/pmcd/src/pmcd.c @@ -51,6 +51,7 @@ static int maxReqPortFd; /* Largest request port fd */ static char configFileName[MAXPATHLEN]; /* path to pmcd.conf */ static char *logfile = "pmcd.log"; /* log file name */ static int run_daemon = 1; /* run as a daemon, see -f */ +static int run_managed; /* run under a manager, see -F */ static char *fatalfile = "/dev/tty";/* fatal messages at startup go here */ static char *pmnsfile = PM_NS_DEFAULT; static char *username; @@ -107,6 +108,7 @@ static pmLongOptions longopts[] = { PMAPI_OPTIONS_HEADER("Service options"), { "", 0, 'A', 0, "disable service advertisement" }, { "foreground", 0, 'f', 0, "run in the foreground" }, + { "managed", 0, 'F', 0, "run in managed (systemd/launchd) mode" }, { "hostname", 1, 'H', "HOST", "set the hostname to be used for pmcd.hostname metric" }, { "username", 1, 'U', "USER", "in daemon mode, run as named user [default pcp]" }, PMAPI_OPTIONS_HEADER("Configuration options"), @@ -132,7 +134,7 @@ static pmLongOptions longopts[] = { static pmOptions opts = { .flags = PM_OPTFLAG_POSIX, - .short_options = "AC:c:D:fH:i:l:L:M:N:n:p:q:Qs:St:T:U:vx:?", + .short_options = "AC:c:D:fFH:i:l:L:M:N:n:p:q:Qs:St:T:U:vx:?", .long_options = longopts, }; @@ -191,6 +193,12 @@ ParseOptions(int argc, char *argv[], int *nports) run_daemon = 0; break; + case 'F': + /* managed, like foreground but do pidfile and uid work */ + run_managed = 1; + run_daemon = 0; + break; + case 'i': /* one (of possibly several) interfaces for client requests */ __pmServerAddInterface(opts.optarg); @@ -1189,7 +1197,7 @@ main(int argc, char *argv[]) DontStart(); } - if (run_daemon) { + if (run_daemon || run_managed) { /* notify service manager, if any, we are ready */ __pmServerNotifyServiceManagerReady(getpid()); if (__pmServerCreatePIDFile(PM_SERVER_SERVICE_SPEC, PM_FATAL_ERR) < 0) diff --git a/src/pmproxy/rc_pmproxy b/src/pmproxy/rc_pmproxy index 2de7adf74da..5029fbbad81 100644 --- a/src/pmproxy/rc_pmproxy +++ b/src/pmproxy/rc_pmproxy @@ -23,7 +23,7 @@ . $PCP_DIR/etc/pcp.env . $PCP_SHARE_DIR/lib/rc-proc.sh -# for chasing arguments we're passed from init/systemd/... +# for chasing arguments we're passed from init/launchd/systemd/... # #debug# echo "$*: `date`" >>$PCP_LOG_DIR/rc_pmproxy.log #debug# env >>$PCP_LOG_DIR/rc_pmproxy.log @@ -188,7 +188,7 @@ $RC_RESET # considered a success. case "$1" in - start|start-systemd|faststart|restart|condrestart|reload|force-reload) + start|start-systemd|start-launchd|faststart|restart|condrestart|reload|force-reload) if [ "$1" = "condrestart" ] && ! is_chkconfig_on pmproxy then status=0 @@ -223,7 +223,7 @@ Error: pmproxy log directory $PCP_LOG_DIR/pmproxy ("'"$PCP_LOG_DIR/pmproxy"'") i fi cd "$PCP_LOG_DIR/pmproxy" - [ "$1" = "start-systemd" ] ||\ + [ "$1" = "start-systemd" -o "$1" = "start-launchd" ] ||\ $ECHO $PCP_ECHO_N "Starting pmproxy ..." "$PCP_ECHO_C" # only consider variables which start with PMPROXY @@ -243,10 +243,11 @@ Error: pmproxy log directory $PCP_LOG_DIR/pmproxy ("'"$PCP_LOG_DIR/pmproxy"'") i $PCP_BINADM_DIR/pmpost "start pmproxy from $prog" - if [ "$1" = "start-systemd" ] + if [ "$1" = "start-systemd" -o "start-launchd" ] then - # Called from systemd with need to preserve the pid and - # systemd has already done the necessary daemonizing + # Called from systemd or launchd with a a need to + # preserve the pid - systemd/launchd has already + # done the necessary daemonizing # rm -rf $tmp exec $PMPROXY -F $OPTS @@ -255,9 +256,6 @@ Error: pmproxy log directory $PCP_LOG_DIR/pmproxy ("'"$PCP_LOG_DIR/pmproxy"'") i fi # otherwise, use the historical approach - # - # When launched by launchctl on macOS, run in foreground mode - [ -n "$LAUNCHED_BY_LAUNCHD" ] && OPTS="$OPTS -f" $PMPROXY $OPTS $RC_STATUS -v fi @@ -269,7 +267,7 @@ Error: pmproxy log directory $PCP_LOG_DIR/pmproxy ("'"$PCP_LOG_DIR/pmproxy"'") i status=0 ;; - stop-systemd) + stop-systemd|stop-launchd) _shutdown quietly status=0 ;; diff --git a/src/pmproxy/src/pmproxy.c b/src/pmproxy/src/pmproxy.c index 8aa439dba6f..ce2a9ebf533 100644 --- a/src/pmproxy/src/pmproxy.c +++ b/src/pmproxy/src/pmproxy.c @@ -28,7 +28,7 @@ #define RUN_DAEMON 1 /* default */ #define RUN_FOREGROUND 2 /* -f */ -#define RUN_SYSTEMD 3 /* -F */ +#define RUN_MANAGED 3 /* -F */ static void *info; /* opaque server information */ static struct pmproxy *server; /* proxy server implementation */ @@ -73,7 +73,7 @@ static pmLongOptions longopts[] = { { "", 0, 'A', 0, "disable service advertisement" }, { "deprecated", 0, 'd', 0, "backward-compatibility mode; no REST APIs" }, { "foreground", 0, 'f', 0, "run in the foreground" }, - { "systemd", 0, 'F', 0, "run in systemd mode" }, + { "managed", 0, 'F', 0, "run in managed (systemd/launchd) mode" }, { "timeseries", 0, 't', 0, "automatic, scalable timeseries; REST APIs" }, { "username", 1, 'U', "USER", "in daemon mode, run as named user [default pcp]" }, PMAPI_OPTIONS_HEADER("Configuration options"), @@ -143,7 +143,7 @@ ParseOptions(int argc, char *argv[], int *nports, int *maxpending) opts.errors++; } else - run_mode = RUN_SYSTEMD; + run_mode = RUN_MANAGED; break; case 'f': /* foreground, i.e. do _not_ run as a daemon */ @@ -446,7 +446,7 @@ main(int argc, char *argv[]) fprintf(stderr, "%s: maxpending=%d from PMPROXY_MAXPENDING=%s in environment\n", "Warning", maxpending, getenv("PMPROXY_MAXPENDING")); - if (run_mode == RUN_DAEMON || run_mode == RUN_SYSTEMD) { + if (run_mode == RUN_DAEMON || run_mode == RUN_MANAGED) { /* notify service manager, if any, we are ready */ __pmServerNotifyServiceManagerReady(mainpid); if (__pmServerCreatePIDFile(PM_SERVER_PROXY_SPEC, PM_FATAL_ERR) < 0) diff --git a/src/zshrc/_pcp b/src/zshrc/_pcp index 3cd28540d40..787656934bc 100644 --- a/src/zshrc/_pcp +++ b/src/zshrc/_pcp @@ -472,7 +472,7 @@ _pcp () { "(-D --debug $exargs)"{-D,--debug}'[set debug options]:options:->debug_opts' \ "(-d --interact $exargs)"{-d,--interact}'[interactive debugging mode]' \ "(-f --foreground $exargs)"{-f,--foreground}'[run in foreground]' \ - "(-F --systemd $exargs)"{-F,--systemd}'[notify service manager (if any) when started and ready]' \ + "(-F --managed $exargs)"{-F,--managed}'[notify service manager (if any) when started and ready]' \ "(-P --primary $exargs)"{-P,--primary}'[run as primary pmie instance]' \ "(-j $exargs)"-j+'[specify stomp protocol file]:file:_files' \ "(-l --logfile $exargs)"{-l+,--logfile=}'[specify log file]:file:_files' \ From bf0dfb652eb576c3b803445ac93bd3fade5c82ba Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Fri, 20 Mar 2026 06:38:29 +1100 Subject: [PATCH 15/31] src/libpcp/src/logmeta.c: rework __pmLogUndeltaInDom() In light of the excellent triage from Jan Kurik over at https://github.com/performancecopilot/pcp/pull/2525 I've refactored the core indom replication part of __pmLogUndeltaInDom() - remove duplicated code - only one place for each of delete instance, add instance from previous full indom and add instance from delta indom - rename tidp to fidp - this points to the previous full indom, not some "temporary" as implied by "t" - clean up the flow of control - add comments to explain what's going on - ensure the reconstructed indom is fully malloc'd so it cannot contain pointers to (instance names in particular) data malloc'd someplace else, or worse in the buffer used to read physical indom records from disk - free any space previously allocated to the delta indom --- src/libpcp/src/logmeta.c | 147 +++++++++++++++++++++++++++------------ 1 file changed, 103 insertions(+), 44 deletions(-) diff --git a/src/libpcp/src/logmeta.c b/src/libpcp/src/logmeta.c index e7c17659442..8c305425a29 100644 --- a/src/libpcp/src/logmeta.c +++ b/src/libpcp/src/logmeta.c @@ -1139,10 +1139,19 @@ PM_FAULT_POINT("libpcp/" __FILE__ ":5", PM_FAULT_ALLOC); return __pmHashAdd((int)dp->pmid, (void *)tdp, &acp->ac_log->hashpmid); } +/* + * idp is the delta indom assumed to be in the (archive) + * hashindom hash from a __pmLogCtl + * + * Undelta'ing this indom involves going backwards in time from + * idp along the temporal chain until we find a "full" indom, then + * going forwards in time undelta'ing each indom until we reach + * and process idp. + */ void __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) { - __pmLogInDom *tidp; /* full indom */ + __pmLogInDom *fidp; /* full indom */ __pmLogInDom *didp; /* delta indom */ char strbuf[20]; @@ -1154,20 +1163,20 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) /* * "next" is in reverse chronological order */ - for (tidp = idp->next; tidp != NULL; tidp = tidp->next) { + for (fidp = idp->next; fidp != NULL; fidp = fidp->next) { if (pmDebugOptions.logmeta && pmDebugOptions.desperate) { - fprintf(stderr, "try next: " PRINTF_P_PFX "%p @", tidp); - StrTimestamp(&tidp->stamp); - fprintf(stderr, " next=" PRINTF_P_PFX "%p prior=" PRINTF_P_PFX "%p numinst=%d isdelta=%d\n", tidp->next, tidp->prior, tidp->numinst, tidp->isdelta); + fprintf(stderr, "try next: " PRINTF_P_PFX "%p @", fidp); + StrTimestamp(&fidp->stamp); + fprintf(stderr, " next=" PRINTF_P_PFX "%p prior=" PRINTF_P_PFX "%p numinst=%d isdelta=%d\n", fidp->next, fidp->prior, fidp->numinst, fidp->isdelta); } - if (!tidp->isdelta) + if (!fidp->isdelta) break; } - if (tidp == NULL) { + if (fidp == NULL) { pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: no full indom record\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf))); pmprintf("__pmLogInDom next chain:\n"); - for (tidp = idp; tidp != NULL; tidp = tidp->next) { - pmprintf("%p isdelta=%d numinst=%d\n", tidp, tidp->isdelta, tidp->numinst); + for (fidp = idp; fidp != NULL; fidp = fidp->next) { + pmprintf("%p isdelta=%d numinst=%d\n", fidp, fidp->isdelta, fidp->numinst); } pmflush(); return; @@ -1175,9 +1184,15 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) /* * found the previous full indom, now march forward in time replacing - * each delta indom with a reconstructed full indom + * each delta indom with a reconstructed full indom ... stop when we + * have replaced idp by a full indom + * + * The undelta'd indom has a newly alloc'd instlist[] and namelist[] + * and strdup'd namelist[i] entries to avoid any storage mangling + * between the full (input) indoms, the delta indoms and the full + * (output) indoms (PMLID_NAMES set in alloc bitfield). */ - for (didp = tidp->prior ; didp != NULL; ) { + for (didp = fidp->prior ; didp != NULL; ) { int numinst; int *instlist; char **namelist; @@ -1205,65 +1220,109 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) StrTimestamp(&didp->stamp); fprintf(stderr, " next=" PRINTF_P_PFX "%p prior=" PRINTF_P_PFX "%p numinst=%d (-> %d) isdelta=%d\n", didp->next, didp->prior, didp->numinst, numinst, didp->isdelta); } - for (i = j = k = 0; i < tidp->numinst || j < didp->numinst; ) { - if (i < tidp->numinst && j < didp->numinst) { - if (didp->namelist[j] == NULL && tidp->instlist[i] == didp->instlist[j]) { - /* delete old instance */ + /* + * need to process all instances from both the full indom and + * the delta indom ... + */ + for (i = j = k = 0; i < fidp->numinst || j < didp->numinst; ) { + if (i < fidp->numinst && j < didp->numinst && + fidp->instlist[i] == didp->instlist[j]) { + if (didp->namelist[j] != NULL) { + /* Woops! */ + pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: full inst[%d]=%d \"%s\" and redefined in delta inst[%d]=%d \"%s\", second one skipped\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf)), i, fidp->instlist[i], fidp->namelist[i], j, didp->instlist[j], didp->namelist[j]); + pmflush(); + j++; + } + else { + /* + * inst id's are equal, but namelist[] from delta + * indom is NULL => this instance was in the + * indom but is no longer there (deleted), so simply + * move over this one, and nothing goes in the + * undelta'd indom + */ if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[-] del from [%d] inst %d \"%s\"\n", j, tidp->instlist[i], tidp->namelist[i]); + fprintf(stderr, "[-] del from full [%d] inst %d \"%s\"\n", i, fidp->instlist[i], fidp->namelist[i]); i++; j++; - continue; } - else if (didp->namelist[j] != NULL && tidp->instlist[i] > didp->instlist[j]) { - /* add new instance in correct sorted position */ + } + else if (i >= fidp->numinst || + (j < didp->numinst && didp->instlist[j] < fidp->instlist[i] )) { + /* + * full indom all processed or inst id from delta indom is + * less than inst id from full indom so add instance from + * delta indom + */ + if (didp->namelist[j] == NULL) { + /* Woops! */ + pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: delta inst[%d]=%d delete but inst not in full indom, skipped\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf)), j, didp->instlist[j]); + pmflush(); + j++; + } + else { if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[%d] add from [%d] inst %d \"%s\"\n", k, j, didp->instlist[j], didp->namelist[j]); + fprintf(stderr, "[%d] add from delta [%d] inst %d \"%s\"\n", k, j, didp->instlist[j], didp->namelist[j]); assert (k < numinst); instlist[k] = didp->instlist[j]; - namelist[k] = didp->namelist[j]; + if ((namelist[k] = strdup(didp->namelist[j])) == NULL) { + pmNoMem("__pmLogUndeltaInDom name from delta", strlen(didp->namelist[j]), PM_FATAL_ERR); + /* NOTREACHED */ + } k++; j++; - continue; } } - if (i < tidp->numinst) { - /* copy instance from end of old indom */ + else { + /* + * delta indom all processed or inst id from full indom is + * less than inst id from delta indom so add instance from + * full indom + */ if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[%d] dup from [%d] inst %d \"%s\"\n", k, i, tidp->instlist[i], tidp->namelist[i]); - assert(k < numinst); - instlist[k] = tidp->instlist[i]; - namelist[k] = tidp->namelist[i]; + fprintf(stderr, "[%d] add from full [%d] inst %d \"%s\"\n", k, i, fidp->instlist[i], fidp->namelist[i]); + assert(fidp->namelist[i] != NULL); + assert (k < numinst); + instlist[k] = fidp->instlist[i]; + if ((namelist[k] = strdup(fidp->namelist[i])) == NULL) { + pmNoMem("__pmLogUndeltaInDom name from full", strlen(fidp->namelist[j]), PM_FATAL_ERR); + } k++; i++; } - else if (j < didp->numinst) { - /* add new instance at end of indom */ - if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[%d] append from [%d] inst %d \"%s\"\n", k, j, didp->instlist[j], didp->namelist[j]); - assert(k < numinst); - instlist[k] = didp->instlist[j]; - namelist[k] = didp->namelist[j]; - k++; - j++; + } + + /* + * didp is going to be totally replaced by instlist[] and namelist[] + * constructed above, so free any space currently allocated to + * didp + */ + if (didp->alloc & PMLID_NAMES) { + for (j = 0; j < didp->numinst; j++) { + if (didp->namelist[j] != NULL) + free(didp->namelist[j]); } } - didp->numinst = numinst; if (didp->alloc & PMLID_INSTLIST) free(didp->instlist); - didp->instlist = instlist; if (didp->alloc & PMLID_NAMELIST) free(didp->namelist); + /* update didp */ + didp->instlist = instlist; + didp->numinst = numinst; didp->namelist = namelist; didp->isdelta = 0; - didp->alloc |= PMLID_INSTLIST|PMLID_NAMELIST; + didp->alloc |= PMLID_INSTLIST|PMLID_NAMELIST|PMLID_NAMES; if (didp == idp) { /* done when we're back to the starting point */ break; } - tidp = didp; + /* + * "prior" is in chronological order + */ + fidp = didp; didp = didp->prior; } } @@ -1965,7 +2024,7 @@ __pmFreeLogInDom(__pmLogInDom *lidp) if (lidp->numinst >= 0) { - if (lidp->alloc & PMLID_NAMES && lidp->namelist != NULL) { + if ((lidp->alloc & PMLID_NAMES) && lidp->namelist != NULL) { int i; for (i = 0; i < lidp->numinst; i++) { if (lidp->namelist[i] != NULL) { @@ -1975,10 +2034,10 @@ __pmFreeLogInDom(__pmLogInDom *lidp) } } - if (lidp->alloc & PMLID_NAMELIST && lidp->namelist != NULL) + if ((lidp->alloc & PMLID_NAMELIST) && lidp->namelist != NULL) free(lidp->namelist); - if (lidp->alloc & PMLID_INSTLIST && lidp->instlist != NULL) + if ((lidp->alloc & PMLID_INSTLIST) && lidp->instlist != NULL) free(lidp->instlist); } From c4a3d4198893089e4b36c00e5172067f86cf4c15 Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Fri, 20 Mar 2026 07:54:14 +1100 Subject: [PATCH 16/31] scripts/tests-from-commits: updates to match current git tree --- scripts/tests-from-commits | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/scripts/tests-from-commits b/scripts/tests-from-commits index 6d34fb76576..06479dff945 100755 --- a/scripts/tests-from-commits +++ b/scripts/tests-from-commits @@ -33,8 +33,10 @@ _hunt_qa() in # not implicated in any particular QA test # - GNUmakefile*\ + COOKBOOK.md\ + |GNUmakefile*\ |Makefile\ + |README\ |all-by-group\ |bad-by-group\ |buildbot/*\ @@ -42,8 +44,9 @@ _hunt_qa() |chk*\ |cull-pmlogger-config\ |disk-work\ - |findmetric\ + |find-metric\ |getpmcdhosts\ + |grind\ |helgrind-suppress\ |mk.*\ |new\ @@ -55,6 +58,8 @@ _hunt_qa() |setup.051\ |show-me\ |sniff4dodgey\ + |triaged\ + |var-use\ |xlate_2_new_pmns) # not used in any QA test scripts ;; [0-9][0-9][0-9][-.]*\ @@ -69,7 +74,8 @@ _hunt_qa() |archives/GNUmakefile*\ |archives/idtohex\ |archives/mk.*\ - |archives/multi*/GNUmakefile*) # not used in any QA test scripts + |archives/multi*/GNUmakefile*\ + |archives/multi*/mk.*) # not used in any QA test scripts ;; # these files are not used in any QA test as far as we can tell # ... @@ -388,7 +394,7 @@ _hunt_qa() cd $here } -# remove files that don't drive QA +# remove files that don't drive QA independent of directory location # _cull() { @@ -433,6 +439,7 @@ _cull() # hard work happens here ... # # map a pathname in the git tree onto QA group(s) +# _map() { while read f @@ -450,6 +457,13 @@ _map() # echo '-g verify' ;; + cscope.run) # not relevant to QA + ;; + docs/*) # not relevant to QA + ;; + flake.nix\ + |nix/*) # not relevant to our QA + ;; man/*\ |*.1) echo '-g man' @@ -529,6 +543,12 @@ _map() src/libpcp/*) echo '-g libpcp' ;; + src/libpcp3/*) + echo '-g compat' + ;; + src/libpcp_archive/*) + echo '-g pmlogextract -g pmlogreduce -g pmlogrewrite -g pmlogger' + ;; src/libpcp_fault/*) echo '-g fault' ;; @@ -544,6 +564,9 @@ _map() src/libpcp_*) echo "$f" | sed -e 's/src\///' -e 's/\/.*//' -e 's/^/-g /' ;; + src/libvalkey/*) + echo '-g pmda.valkey -g libpcp_web -g pmproxy' + ;; src/newhelp/*) echo '-g help' ;; @@ -723,7 +746,7 @@ _map() tools/*) # not used in any QA test scripts ;; *) - echo >&2 "Warning: $f: no matching QA group from _map" + echo >&2 "Warning: $f: no matching QA group from _map()" ;; esac done @@ -760,7 +783,7 @@ _expand() _usage() { - echo >&2 "Usage: groups-to-test [options]" + echo >&2 "Usage: tests-from-commits [options]" echo >&2 echo >&2 "options:" echo >&2 " -b branch [defaults to main]" From c2c72fbc80c3ebec0a37007bc3afc59f3135912c Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Fri, 20 Mar 2026 07:54:53 +1100 Subject: [PATCH 17/31] scripts/fix-md: add -k to check tables - each row in a table begin with | - number of columns the same for all rows --- scripts/fix-md | 59 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/scripts/fix-md b/scripts/fix-md index a81f511a30a..22611f73391 100755 --- a/scripts/fix-md +++ b/scripts/fix-md @@ -32,9 +32,10 @@ _usage() { echo >&2 "Usage: fix-md [options] [infile]" echo >&2 "Options:" - echo >&2 " -a all changes, so -r, -t, -i and -l [this is the default]" + echo >&2 " -a all changes, so -r, -t, -i, -k and -l [this is the default]" echo >&2 " -c N columns for Index (1..9) [default: 4]" echo >&2 " -i build|replace Index" + echo >&2 " -k check tables" echo >&2 " -l link and anchor check" echo >&2 " -n show me diffs" echo >&2 " -o overwrite infile" @@ -76,11 +77,12 @@ showme=false overwrite=false toc=false renumber=false +tables=false lacheck=false verbose=false very_verbose=false exitonly=false -while getopts 'ac:ilnortvx?' p +while getopts 'ac:iklnortvx?' p do case "$p" in @@ -103,6 +105,8 @@ do ;; i) index=true ;; + k) tables=true + ;; l) lacheck=true ;; n) showme=true @@ -122,7 +126,7 @@ do ;; x) exitonly=true ;; - ?) _usage + *) _usage exit ;; esac @@ -173,13 +177,14 @@ then exit fi -if ! $renumber && ! $toc && ! $index && ! $lacheck +if ! $renumber && ! $toc && ! $index && ! $tables && ! $lacheck then # do everything # renumber=true toc=true index=true + tables=true lacheck=true fi @@ -519,6 +524,11 @@ BEGIN { want = '"$entpercol"'; ent = 0; col = 1 } print "|---" >"'"$tmp."'" col ent = 1 } + } +END { while (ent < want) { + print "|" >"'"$tmp."'" col + ent++ + } }' # cull from # Index heading to end of file @@ -535,6 +545,46 @@ $1 == "#" && $2 == "Index" && NF == 2 { exit } mv $tmp.tmp $tmp.md fi +# Check tables +# +if $tables +then + # need to strip | from "..." and `...` and escaped | so that + # split() does the right thing + # + nl -ba <$tmp.md \ + | sed \ + -e 's/"[^"]*"//g' \ + -e 's/`[^`]*`//g' \ + -e 's/\\|//g' \ + | awk ' +intable == 0 && $2 ~ /^[|]/ { + intable = 1 + ncol = split($0, cols, /[|]/) + next + } +intable == 1 { if (NF == 1) { + # end of table + intable = 0 + next + } + if ($2 !~ /^[|]/) { + print "'"$1"'[" NR "] Error: line does not start with | within a table" >"'$tmp.error'" + } + else { + x = split($0, cols, /[|]/) + if (x != ncol) { + print "'"$1"'[" NR "] Warning: table line contains " x " \"|\" (expecting " ncol ")" >"'$tmp.warn'" + if ('"$very_verbose"' = "true") { + for (i = 1; i <= x +1; i++) + print "col[" i "] \"" cols[i] "\"" >"'$tmp.warn'" + } + } + } + }' + _check +fi + # Check integrity of internal links and anchors # if $lacheck @@ -563,6 +613,7 @@ $1 ~ /^[0-9][0-9]*$/ { lineno = $1; next } # (excluding duplicates) # awk <$tmp.anchors >$tmp.tmp ' +$2 == "href" { next} { if ($2 == "name") print "'"$1"'[" NR "] Warning: Old anchor: ... prefer for HTML5" >"'$tmp.warn'" else if ($2 != "id") From 8b2749cef15e0ecb40d9a3f39f28f3106c763ba4 Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Fri, 20 Mar 2026 07:56:32 +1100 Subject: [PATCH 18/31] qa/grind: report iteration number when .out.bad found --- qa/grind | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/grind b/qa/grind index 9be9d1cf914..417b97e0635 100755 --- a/qa/grind +++ b/qa/grind @@ -98,5 +98,5 @@ done for seq in $seqlist do - [ -f $seq.out.bad ] && echo "$seq failed, yipee!" + [ -f $seq.out.bad ] && echo "$seq failed at iter $iter, yipee!" done From 9f1740cf7858bd7ae04f549412b5c4e35a638da0 Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Fri, 20 Mar 2026 07:57:22 +1100 Subject: [PATCH 19/31] qa/group: add a couple of tests to the indom group related to __pmLogUndeltaInDom() --- qa/group | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/group b/qa/group index 1c1008ffce3..3610d502c4e 100644 --- a/qa/group +++ b/qa/group @@ -2191,8 +2191,8 @@ suse 1651 pmlogger_daily logutil local 1652 htop pcp local 1653 pmda.denki local -1654 archive_v3 libpcp local -1655 archive_v3 libpcp local valgrind +1654 archive_v3 libpcp local indom +1655 archive_v3 libpcp local valgrind indom 1658 pmda.linux local 1660 libpcp labels local 1661 pmproxy libpcp_web pmlogger local pmlc From 04f265155ec488ebf7737db694d5ea304b869b5d Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Fri, 20 Mar 2026 07:59:01 +1100 Subject: [PATCH 20/31] qa/COOKBOOK.md: next iteration adding content All of qa/README has been moved to COOKBOOK.md and README reduced to a thin wrapper than directs the reader to COOKBOOK.md. --- qa/COOKBOOK.md | 402 ++++++++++++++++++++++++++++++++++--------------- qa/README | 236 ----------------------------- 2 files changed, 284 insertions(+), 354 deletions(-) diff --git a/qa/COOKBOOK.md b/qa/COOKBOOK.md index b11aafb9821..a61497b6e29 100644 --- a/qa/COOKBOOK.md +++ b/qa/COOKBOOK.md @@ -9,7 +9,7 @@
   [3.2 Dealing with the Known Unknowns](#dealing-with-the-known-unknowns)
[4 **check** script](#check-script)
   [4.1 **check** setup](#check-setup) -
   [4.2 **check** command line options](#check-command-line-options) +
   [4.2 command line options for **check** ](#command-line-options-for-check-)
   [4.3 **check.callback** script](#check.callback-script)
   [4.4 *check.log* file](#check.log-file)
   [4.5 *check.time* file](#check.time-file) @@ -20,12 +20,13 @@
   [7.1 Take control of stdout and stderr](#take-control-of-stdout-and-stderr)
   [7.2 **$seq_full** file suggestions](#seqfull-file-suggestions)
[8 Shell functions from *common.check*](#shell-functions-from-common.check) +
   [8.1 **\_triage_wait_point**](#triagewaitpoint)
[9 Shell functions from *common.filter*](#shell-functions-from-common.filter)
[10 Control files](#control-files)
   [10.1 The *group* file](#the-group-file)
   [10.2 The *triaged* file](#the-triaged-file)
   [10.3 The *localconfig* file](#the-localconfig-file) -
[11 Other helper scripts](#other-helper-scripts) +
[11 Helper scripts](#helper-scripts)
   [Summary](#summary)
   [11.1 **mk.logfarm** script](#mk.logfarm-script)
   [11.2 **mk.qa_hosts** script](#mk.qahosts-script) @@ -40,8 +41,14 @@
[15 *common* and *common.\** files](#common-and-common.-files)
[16 Selinux considerations](#selinux-considerations)
[17 Package lists](#package-lists) +
[18 The last word](#the-last-word)
[Initial Setup Appendix](#initial-setup-appendix)
   [**sudo** setup](#sudo-setup) +
   [Distributed QA](#distributed-qa) +
   [Firewall setup](#firewall-setup) +
   [*common.config* files](#common.config-files) +
   [Some special test cases](#some-special-test-cases) +
   [Take it for a test drive](#take-it-for-a-test-drive)
[PCP Acronyms Appendix](#pcp-acronyms-appendix)
[Index](#index) @@ -51,7 +58,7 @@ These notes are designed to help with building, running and maintaining QA (Quality Assurance) tests for the Performance Co-Pilot ([PCP](#idx+pcp)) project -([www.pcp.io](http://www.pcp.io/) and +([www.pcp.io](https://www.pcp.io/) and [https://github.com/performancecopilot/pcp](https://github.com/performancecopilot/pcp/)). The PCP QA infrastructure is designed with a philosophy that aims to @@ -96,7 +103,7 @@ Some of these require "root" privileges, refer to the But this also means the QA tests may alter existing system configuration files, and this introduces some risk, so PCP QA should not be run -on production systems. Historically we have used developer systems +on production systems. Historically we have used developer systems and dedicated QA systems for running QA - VMs are particularly well-suited to this task. @@ -131,12 +138,12 @@ we'd ever have more than a thousand test scripts! # 2 The basic model Minimally each test consists of a shell script **$seq** and an expected output -file **$seq.out**. +file **$seq***.out*. When run under the control of **check**, **$seq** is executed and the -output is captured and compared to **$seq.out**. If the two outputs are +output is captured and compared to **$seq***.out*. If the two outputs are identical the test is deemed to have passed, else the (unexpected) -output is saved to **$seq.out.bad**. +output is saved to **$seq***.out.bad*. Central to this model is the fact that **$seq** must produce deterministic output, independent of hostname, filesystem pathname @@ -149,11 +156,12 @@ The tests scripts are expected to exit with status 0, but may exit with a non-zero status in cases of catastrophic failure, e.g. some service to be exercised did not start correctly, so there is nothing to test. -As tests are developed and evolve, the **remake** script is used to -generate updated versions of **$seq.out**. +As tests are developed and evolve, the [**remake**](#idx+cmds+remake) +script is used to +generate updated versions of **$seq***.out*. To assist with test failure triage, all tests also generate a -**$seq.full** file that contains additional diagnostics and unfiltered +**$seq***.full* file that contains additional diagnostics and unfiltered output.
@@ -249,7 +257,7 @@ determining their outcome as follows: |**notrun**|test called [**_notrun**](#idx+funcs+notrun)| |**callback**|same as **pass** but [**check.callback**](#check.callback-script) was run and detected a problem| |**fail**|test exit status was not 0| -|**triaged**|special kind of **fail**, see [the *triaged* file](#the-triaged-file) section below +|**triaged**|special kind of **fail**, see [the *triaged* file](#the-triaged-file) section below| The non-option command line arguments identify tests to be run using one or more *seqno* or a range *seqno*-*seqno*. @@ -258,10 +266,10 @@ are removed. Leading zeroes may be omitted, so all of the following are equivalent. ``` -010 00? # assume the shell's glob will expand this -010 009 008 007 006 005 004 003 002 001 -0-10 000 -000 1 002 3 4-9 10 +check 010 00? # assume the shell's glob will expand this +check 010 009 008 007 006 005 004 003 002 001 +check 0-10 000 +check 000 1 002 3 4-9 10 ``` If no *seqno* is specified, the default is to select all tests @@ -279,10 +287,11 @@ the following tasks before any test is run:
- ensure the **sample**, **sampledso** and **simple** [PMDAs](#idx+pmda) are installed and working - ensure **pmcd**(1), **pmproxy**(1) and **pmlogger**(1) are all configured to allow remote connections - ensure the primary **pmlogger**(1) instance is running -- run `make setup` which will run `make setup` in multiple subdirectories, but most importantly *src* (so the QA apps are made), *tmparchive* (so the transient archives are present) and *pmdas* (so the QA [PMDAs](#idx+pmda) are up to date) +- if [Distributed QA](#distributed-qa) has been enabled, check that the PCP setup on the remote systems is OK +- run `make setup` which will run `make setup` in multiple subdirectories, but most importantly *src* (so the QA apps are made), *tmparch* (so the transient archives are present) and *pmdas* (so the QA [PMDAs](#idx+pmda) are up to date) - -## 4.2 **check** command line options + +## 4.2 command line options for **check** The parsing of command line arguments is a little Neanderthal, so best practice is to separate options with whitespace. @@ -353,16 +362,16 @@ Refer to the [**mk.qa_hosts**](#mk.qahosts-script) section. Usage: **show-me** \[**-g** *group*] \[**-l**] \[**-n**] \[**-x** *group*] \[seqno ...] The **show-me** script is responsible for displaying the differences -between the actual output (**$seq.out.bad**) and the expected output -(**$seq.out**) for selected tests. +between the actual output (**$seq***.out.bad*) and the expected output +(**$seq***.out*) for selected tests. The command line options are: |**Option**|**Description**| |---|---| |**-g** *group*|Select the failed tests from the group *group*.| -|**-l**|Simple **diff**(1), the default is to use a graphical diff tool if one can be found -|**-n**|Show me, just report *seqno* for failing tests, no diffs +|**-l**|Simple **diff**(1), the default is to use a graphical diff tool if one can be found| +|**-n**|Show me, just report *seqno* for failing tests, no diffs| |**-x** *group*|Exclude the failed tests from the group *group*.| If no **-g** option and no *seqno* is specified on the command line, @@ -383,7 +392,7 @@ and the following shell variables that may be used in your test script. |**$seq_full**|Proper pathname to the test's *.full* file. Always use this in preference to **$seq**.*full* because **$seq_full** works no matter where the test script might have **cd**'d to.| |**$status**| Exit status for the test script.| |**$sudo**|Proper invocation of **sudo**(1) that includes any per-platform additional command line options.| -|**$tmp**|Unique prefix for temporary files or directory. Use **$tmp.foo** or `$ mkdir $tmp` and then use **$tmp/foo** or both. The standard **trap** cleanup in each test will remove all these files and directories automatically when the test finishes, so save anything useful to **$seq_full**.| +|**$tmp**|Unique prefix for temporary files or directory. Use **$tmp***.foo* or `$ mkdir $tmp` and then use **$tmp***/foo* or both. The standard **trap** cleanup in each test will remove all these files and directories automatically when the test finishes, so save anything useful to **$seq_full**.| # 7 Coding style suggestions for tests @@ -396,13 +405,24 @@ stderr or both, the test may need to take control to capture all the output and prevent platform-specific or libc-version-specific buffer flushing that makes the output non-deterministic. -Instead of
-`$ cmd | _filter`
-the test may need to do
-`$ cmd 2>&1 | _filter`
-or even
-`$ cmd >$tmp.out 2>$tmp.err`
-`$ cat $tmp.err $tmp.out | _filter` +Instead of + +``` +$ cmd | _filter +``` + +the test may need to do + +``` +$ cmd 2>&1 | _filter +``` + +or even + +``` +$ cmd >$tmp.out 2>$tmp.err +$ cat $tmp.err $tmp.out | _filter +``` ## 7.2 **$seq_full** file suggestions @@ -425,7 +445,7 @@ $ echo ... >>$seq_full $ cmd ... | tee -a $seq_full | ... ``` -Remember that **$seq_full** translates to file **$seq.full** (dot, not underscore) in the directory the **$seq** test is run from. +Remember that **$seq_full** translates to file **$seq***.full* (dot, not underscore) in the directory the **$seq** test is run from. # 8 Shell functions from *common.check* @@ -455,7 +475,7 @@ handles: |**\_check_agent**|Usage: **\_check_agent** *pmda* \[*verbose*]
Checks that the *pmda* [PMDA](#idx+pmda) is installed and responding to metric requests. Returns 0 if all is well, else returns 1 and emits diagnostics on stdout to explain why. If *verbose* is **true** emit diagnostics independent of return value.| |**\_check_core**|TODO| |**\_check_display**|TODO| -|**\_check_freespace**|Usage: **\_check_freespace** *need*
Returns 0 if there is more that *need* Mbytes of free space in the filesystem for the current working directory, else returns 1. +|**\_check_freespace**|Usage: **\_check_freespace** *need*
Returns 0 if there is more that *need* Mbytes of free space in the filesystem for the current working directory, else returns 1.| |**\_check_job_scheduler**|TODO| |**\_check_key_server**|TODO| |**\_check_key_server_ping**|TODO| @@ -524,7 +544,7 @@ handles: |**\_stop_auto_restart**|Usage: **\_stop_auto_restart** *service*
When testing error handling or timeout conditions for services it may be important to ensure the system does not try to restart a failed service (potentially leading to an hard loop of retry-fail-retry). **\_stop_auto_start** will change configuration to prevent restarting for *service* if the system supports this function.
Use **\_restore_auto_restart** with the same *service* to reinstate the configuration.| |**\_systemctl_status**|TODO| |**\_triage_pmcd**|TODO| -|**\_triage_wait_point**|TODO| +|**\_triage_wait_point**|See the [**\_triage_wait_point**](#triagewaitpoint) section below.| |**\_try_pmlc**|TODO| |**\_wait_for_pmcd**|TODO| |**\_wait_for_pmcd_stop**|TODO| @@ -545,6 +565,40 @@ handles: |**\_within_tolerance**|TODO| |**\_writable_primary_logger**|TODO| + +## 8.1 **\_triage_wait_point** + +Usage: **\_triage_wait_point** [*message*] + +If you have a QA test that needs triaging after it has done some setup +(e.g. start a QA version of a daemon, install a PMDA, or unpack a +"fake" set of kernel stats files, create an archive), then add a call +to **\_triage_wait_point** in the test once the setup has been done. + +If *message* is specified it will be echoed and +this allows the test to disclose useful information from the setup, e.g. a process ID or the path to where the magic files have been unpacked. + + +Now, to triage the test: + +``` +$ touch $seq.wait +$ ./$seq +``` + +and when **\_triage_wait_point** is called it will emit *message* +(if specified) on stdout, and go into a sleep-check loop waiting +for **$seq***.wait* to disappear. +So at this point the test is suspended and you can go poke a process, look +at a log file, check an archive, ... + +When the triage is done, + +``` +$ rm $seq.wait +``` +and the test will resume. + # 9 Shell functions from *common.filter* @@ -634,7 +688,7 @@ Comments within the file provide further information as to format. ## 10.2 The *triaged* file Some tests may fail in ways that after careful analysis are deemed to be -a "test" failure, rather than a PCP failure or regression. Causes might be +a "test" failure, rather than a PCP failure or regression. Causes might be timing issues that are impossible to control or failures on slow VMs or caused by non-PCP code that's failing. @@ -655,8 +709,8 @@ The *localconfig* file is generated by the **mk.localconfig** script. It defines the shell variables *localconfig* is sourced from **common.check** so every test script has access to these shell variables. - -# 11 Other helper scripts + +# 11 Helper scripts There are a large number of shell scripts in the QA directory that are intended for common QA development and triage tasks beyond simply @@ -669,10 +723,10 @@ running tests with **check**. |---|---| |**all-by-group**|Report all tests (excluding those tagged **:retired** or **:reserved**) in *group* sorted by group.| |**appchange**|Options: \[**-c**] *app1* \[*app2* ...]
Recheck all QA tests that appear to use the test application src/*app1* or *src/app2* or ... *${TMPDIR:-/tmp}/appcache* is a cache of mappings between test sequence numbers and uses, for all applications in *src/* \... **appchange** will build the cache if it is not already there, use **-c** to clear and rebuild the cache.| -|**bad-by-group**|Use the *\*.out.bad* files to report failures by group. +|**bad-by-group**|Use the *\*.out.bad* files to report failures by group.| |**check.app.ok**|Options: *app*
When the test application *src/app.c* (or similar) has been changed, this script
(a) remakes the application and checks **make**(1) status, and
(b) finds all the tests that appear to run the *src/app* application and runs **check** for these tests.| |**check-auto**|Options: \[*seqno* ...]
Check that if a QA script uses **\_stop_auto_restart** for a (**systemd**) service, it also uses **\_restore_auto_restart** (preferably in \_cleanup()). If no *seqno* options are given then check all tests.| -|**check-flakey**|Options: \[*seqno* ...\]
Recheck failed tests and try to classify them as "flakey" if they pass now, or determine if the failure is "hard" (same **$seqno.out.bad**) or some other sort of non-deterministic failure. If no *seqno* options are given then check all tests with a **\*.out.bad*** file.| +|**check-flakey**|Options: \[*seqno* ...\]
Recheck failed tests and try to classify them as "flakey" if they pass now, or determine if the failure is "hard" (same *seqno.out.bad*) or some other sort of non-deterministic failure. If no *seqno* options are given then check all tests with a *\*.out.bad* file.| |**check-group**|Options: *query*
Check the *group* file and test scripts for a specific *query* that is assumed to be **both** the name of a command that appears in the test scripts (or part of a command, e.g. **purify** in **\_setup_purify**) and the name of a group in the *group* file. Report differences, e.g. *command* appears in the *group* file for a specific test but is not apparently used in that test, or *command* is used in a specific test but is not included in the *group* file entry for that test.
There are some special cases to handle the pcp-foo commands, aliases and [PMDAs](#idx+pmda) ... refer to **check-group** for details.
Special control lines like:
`# check-group-include: group ...`
`# check-group-exclude: group ...`
may be embedded in test scripts to over-ride the heuristics used by **check-group**.| |**check-pdu-coverage**|Check that PDU-related QA apps in *src* provide full coverage of all current PDU types.| |**check-setup**|Check QA environment is as expected. Documented in *README* but not used otherwise.| @@ -681,25 +735,24 @@ running tests with **check**. |**daily-cleanup**|Run from **check**, this script will try to make sure the **pmlogger_daily**(1) work has really been done; this is important for QA VMs that are only booted for QA and tend to miss the nightly **pmlogger_daily**(1) run.| |**find-app**|Options: *app*
Find and report tests that use a QA application *src/app*.| |**find-bound**|Options: *archive* *timestamp* *metric* \[*instance*]
Scan *archive* for values of *metric* (optionally constrained to the one *instance*) within the interval *timestamp* (in the format HH:MM:SS, as per **pmlogdump**(1) and assuming a timezone as per **-z**).| -|**find-metric**|Options: \[**-a**\|**-h**] *pattern* ...
Search for metrics with name or metadata that matches *pattern*. With **-h** interrogate the local **pmcd**(1), else with **-a** (the default) search all the QA archives in the directories *archive* and *tmparchive*.
Multiple pattern arguments are treated as a disjunction in the search which uses **grep**(1) style regular expressions. Metadata matches are against the **pminfo**(1) **-d** output for the type, instance domain, semantics, and units.| +|**find-metric**|Options: \[**-a**\|**-h**] *pattern* ...
Search for metrics with name or metadata that matches *pattern*. With **-h** interrogate the local **pmcd**(1), else with **-a** (the default) search all the QA archives in the directories *archive* and *tmparch*.
Multiple pattern arguments are treated as a disjunction in the search which uses **grep**(1) style regular expressions. Metadata matches are against the **pminfo**(1) **-d** output for the type, instance domain, semantics, and units.| |**flakey-summary**|Assuming the output from **check-flakey** has been kept for multiple QA runs across multiple hosts and saved in a file called *flakey*, this script will summarize the test failure classifications.| |**getpmcdhosts**|Options: lots of them
Find a remote host matching a selection criteria based on hardware, operating system, installed [PMDA](#idx+pmda), primary logger running, etc. Use
`$ getpmcdhosts -?`
to see all options.| |**grind**|Options: *seqno* \[...]
Run select test(s) in an loop until one of them fails and produces a **.out.bad** file. Stop with Ctl-C or for a more orderly end after the current iteration
`$ touch grind.stop`| -|**grind-pmda**|Options: *pmda* *seqno* \[...]
Exercise the *pmda* [PMDA](#idx+pmda) by running the PMDA's **Install** script, then using **check** to run all the selected tests, checking that the PMDA is still installed, running the PMDA's **Remove** script, then running the selected tests again and checking that the PMDA is still **not** installed. -|**group-stats**|Report test frequency by group, and report any group name anomalies. -|**mk.localconfig**|Recreate the *localconfig* file that provides the platform and PCP version information and the *src/localconfig.h* file that can be used by C programs in the *src* directory. -|**mk.logfarm**|See the [**mk.logfarm**](#mk.logfarm-script) section. -|**mk.pcpversion**|REMOVE NOT USED TODO -|**mk.qa_hosts**|See the [**mk.qa_hosts**](#mk.qahosts-script) section. -|**mk.variant**|TOO HARD TODO -|**new**|See the [**new**](#the-new-script) section. -|**new-dup**| -|**new-grind**| -|**new-seqs**| -|**really-retire**| -|**recheck**| -|**remake**| -|**sameas**|Options: *seqno* \[...]
See if *seqno***.out** and *seqno***.out.bad** are identical except for line ordering. Useful to detect cases where non-determinism is caused by the order in which subtests were run, e.g. sensitive to directory entry order in the filesystem or metric name order in the [PMNS](#idx+pmns). +|**grind-pmda**|Options: *pmda* *seqno* \[...]
Exercise the *pmda* [PMDA](#idx+pmda) by running the PMDA's **Install** script, then using **check** to run all the selected tests, checking that the PMDA is still installed, running the PMDA's **Remove** script, then running the selected tests again and checking that the PMDA is still **not** installed.| +|**group-stats**|Report test frequency by group, and report any group name anomalies.| +|**mk.localconfig**|Recreate the *localconfig* file that provides the platform and PCP version information and the *src/localconfig.h* file that can be used by C programs in the *src* directory.| +|**mk.logfarm**|See the [**mk.logfarm**](#mk.logfarm-script) section.| +|**mk.qa_hosts**|See the [**mk.qa_hosts**](#mk.qahosts-script) section below.| +|**mk.variant**|Options: *seqno*
Sometimes a test has no choice other than to produce different output on different platforms. This script may be used to convert an existing test to accommodate multiple *seqno.out* files.| +|**new**|See the [**new**](#the-new-script) section above.| +|**new-dup**|Options: \[**-n**] *seqno*
Make a copy of the test *seqno* using a new test number as assigned by [**new**](#the-new-script), including rewriting the old *seqno* in the new test and its new *.out* file. **-n** is "show me" mode and no changes are made.| +|**new-grind**|Options: \[**-n**] \[**-v**] *seqno*
Make a copy of the test *seqno* using a new test number as assigned by [**new**](#the-new-script) and arrange matters so the new test runs the old test but selects the **valgrind**(1) sections of that test. **-n** is "show me" mode and no changes are made, use **-v** for more verbosity.| +|**new-seqs**|Report the unallocated blocks of test sequence numbers from the *group* file.| +|**really-retire**|Options: *seqno* \[...]
Mark the selected tests as **:retired** in the *group* file and then replace the test and its *.out* file with boilerplate text that explains what has happened and unilaterally calls **_notrun** (in case the test is ever really run).| +|**recheck**|Options: \[**-t**] \[*options*] \[*seqno* ...\]
Run **check** again for failed tests. If no *seqno* options are given then check all tests with a *\*.out.bad* file. By default tests that failed last time and were classified as **triaged** will not be rerun, but **-t** overrides this. Other *options* are any command line options that **check** understands.| +|**remake**|Options: \[*options*] *seqno* \[...]
Remake the *.out* file for the specified test(s). Command line parsing is the same as **check** so *seqno* can be a single test sequence number, or a range, or a **-g** *group* specification. Similarly **-l** selects **diff**(1) rather than a graphical diff tool to show the differences.
Since the *seqno.out* files are precious and reflect the state of the qualified and expected output, they should typically not be changed unless some change has been made to the *seqno* test or the applications the test runs produce different output or the filters in the test have changed.| +|**sameas**|Options: *seqno* \[...]
See if *seqno.out* and *seqno.out.bad* are identical except for line ordering. Useful to detect cases where non-determinism is caused by the order in which subtests were run, e.g. sensitive to directory entry order in the filesystem or metric name order in the [PMNS](#idx+pmns).| |**var-use**|Options: *var* \[*seqno* ...]
Find assignment and uses of the shell variable \[**$**]*var* in tests. If *seqno* not specified, search all tests.|
@@ -742,8 +795,13 @@ otherhost archives/ok-foo 20011002.00.10-00 ## 11.2 **mk.qa_hosts** script -The **mk.qa_hosts** script makes the -The process uses the domain name for +The **mk.qa_hosts** script includes heuristics for selecting +and sorting the list of potential remote PCP QA hosts +*qa_hosts.primary*). +Refer to the comments in *qa_hosts.primary*, +and make appropriate changes. + +The heuristics use the domain name for the current host to choose a set of hosts that can be considered when running distributed tests, e.g. **pmlogger**(1) locally and **pmcd**(1) on a remote host. Anyone wishing to do this sort of @@ -853,19 +911,32 @@ other-packages/manifest et al **admin/list-packages** ... -c ... -m ... -n ... -v ... + +# 18 The last word + +If you find something that does not work or seem right, then +either send email to pcp@groups.io +or join the Performance Co-Pilot chat at +[www.performancecopilot.slack.com](https://www.performancecopilot.slack.com/) and +and post to the **#pcpqa** channel. + +Better still, if you can fix the problem or create +additional QA tests please commit these to **git** and open +a Pull Request at +[https://github.com/performancecopilot/pcp](https://github.com/performancecopilot/pcp) + + # Initial Setup Appendix -TODO - incorporate README info - ## **sudo** setup -The PCP tests are designed to be run by a non-root user. Where "root" +The PCP tests are designed to be run by a non-root user. Where "root" privileges are needed, e.g. to stop or start **pmcd**(1), **Install** or **Remove** -PMDAs, etc. the **sudo**(1) application is used. When using **sudo** for QA, +PMDAs, etc. the **sudo**(1) application is used. When using **sudo** for QA, your current user login needs to be able to execute commands as -root without being prompted for a password. This can be achieved by +root without being prompted for a password. This can be achieved by adding the following line to the */etc/sudoers* file: ``` @@ -877,13 +948,107 @@ and checked with $ sudo id ``` + +## Distributed QA + +PCP employs a cient-server architecture, and so some parts of the +QA infrastructure involve testing one component running on the local +system and another component running on a remote system. For example + +``` +$ pmrep -h remote +``` +runs **pmrep**(1) locally which interacts with **pmcd**(1) on the +host `remote`. + +To make this work, some additional effort is required in the QA setup +both locally and on the remote system(s). + +Refer to the [**mk.qahosts** script](#mk.qahosts-script) section +to see how the remote QA hosts are configured. + +For each of the potential remote PCP QA hosts, the following must be +set up: + +1. PCP installed from packages, +2. **pmcd**(1) running, +3. a login for the user **pcpqa** needs to be created, and then set up in such a way that **ssh**(1) and **scp**(1) will work without the need for any password, i.e. these sorts of commands
`$ ssh pcpqa@pcp-qa-host some-command`
`$ scp some-file pcpqa@pcp-qa-host:some-dir`
must work correctly when run from the local host with no interactive input and no Password: prompt

On Selinux systems it may be necessary to execute the following command to make this work:
`$ sudo chcon -R unconfined_u:object_r:ssh_home_t:s0 ~pcpqa/.ssh`
so that the ssh_home_t attribute is set on ~pcpqa/.ssh and all the files below there.

The **pcpqa** user's environment must also be initialized so that their shell's path includes all of the PCP binary directories (identify these with `$ grep BIN /etc/pcp.conf`), so that all PCP commands are executable without full pathnames. Of most concern would be auxilliary directory (usually */usr/lib/pcp/bin*, */usr/share/pcp/bin* or */usr/libexec/pcp/bin*) where commands like **pmlogger_daily**(1), **pmnsadd**(1), **newhelp**(1), **mkaf**(1)etc.) are installed.

And finally, the **pcpqa** user needs to be included in the group **pcp** in */etc/group*. + +Once you've setup the remote PCP QA hosts and modified *common.config* +and *qa_hosts.primary* locally, then run validate the setup using [check-setup](#check-setup): + +``` +$ ./check-setup +``` + + +## Firewall setup + +Network firewalls can get in the way, especially if you're attempting +any {distributed QA](#distributed-qa). + +In addition to the standard **pmcd**(1) port(s) +(TCP ports 44321, 44322 and 44323) one needs to open ports to allow +incoming connections and outgoing connections on a range of ports +for **pmdatrace**(1), **pmlogger**(1) connections via **pmlc**(1), and some QA tests. +Opening the TCP range 4320 to 4350 (inclusive) should suffice for these +additional ones. + + +## *common.config* files + +This script uses heuristics to set a number of +interesting variables, specifically: + +|**Shell Variable**|**Description**| +|---|---| +|**$PCPQA_CLOSE_X_SERVER**|The **$DISPLAY** setting for an X server that is willing to accept connections from X clients running on the local machine. This is optional, and if not set any QA tests dependent on this will be skipped.| +|**$PCPQA_FAR_PMCD**|The hostname for a host running **pmcd**(1), but the host is preferably a long way away (in terms of TCP/IP latency) for timing tests. This is optional, and if not set any QA tests dependent on this will be skipped.| +|**$PCPQA_HYPHEN_HOST**|The hostname for a host running **pmcd**(1), with a hyphen (-) in the hostname. This is optional, and if not set any QA tests dependent on this will be skipped.| + +If relevant, edit this file to provide suitable settings for the local environment. + + +## Some special test cases + +For test 051 we need five local hostnames that are valid, although PCP +does not need to be installed there, nor pmcd(1) running. The five +hosts listed in 051.hosts (the comments at the start of this file +explain what is required) should suffice for most installations. + +Some tests are graphical, and wish to make use of your display. +For authentication to succeed, you may need to perform some +access list updates, e.g. "xhost +local:" for such tests to pass +(e.g. test 325). + + +## Take it for a test drive + +You can now verify your QA setup, by running: + +``` +$ ./check 000 +``` + +The first time you run [**check**](#check-script) it will descend into the +[*src*](#src) directory and make all of the QA test programs and then +descend into the [*tmparch*](#tmparch) directory and recreate +the transient PCP archives, so some patience may be required. + +If test 000 fails, it may be that you have locally developed PMDAs +or optional PMDAs installed. Edit *common.filter* and modify the +[**_filter_top_pmns**](#idx+funcs+filtertoppmns) function to strip the top-level name components +for any new metric names (there are lots of examples already there) +... if these are distributed (shipped) PMDAs, please update the list +in *common.filter* and commit the changes to **git**. + # PCP Acronyms Appendix |**Acronym**|**Description**| |---|---| |**PCP**|**P**erformance **C**o-**P**ilot| -|**PMAPI**|**P**erformance **M**etrics **A**pplication **I**nterface: the public interfaces supported by *libpcp*|| +|**PMAPI**|**P**erformance **M**etrics **A**pplication **I**nterface: the public interfaces supported by *libpcp*| |**PMCD**|**P**erformance **M**etrics **C**ollection **D**aemon: aka **pmcd**(1), the source of all performance metric metadata and data on the local host, although the real work is delegated to the PMDAs| |**PMDA**|**P**erformance **M**etrics **D**omain **A**gent: a "plugin" for **pmcd**(1) that is responsible for an independent subset of the available performance metrics| |**PMNS**|**P**erformance **M**etrics **N**ame **S**pace: all of the metric names in a PCP archive or known to **pmcd**(1)| @@ -892,7 +1057,7 @@ $ sudo id .\" control lines for scripts/man-spell -- need to fake troff comment here .\" +ok+ _restore_auto_restart _stop_auto_restart _setup_purify .\" +ok+ PCP_AWK_PROG getpmcdhosts localconfig pcpversion -.\" +ok+ tmparchive wallclock datestamp testsuite timeshift not_in_ci +.\" +ok+ tmparch wallclock datestamp testsuite timeshift not_in_ci .\" +ok+ appchange otherhost qa_hosts valgrind _cleanup PCP_star helgrind .\" +ok+ seq_full zeroconf thishost appcache precheck _service .\" +ok+ selinux Selinux _notrun logfarm rootdir sameas idxctl github @@ -943,7 +1108,7 @@ $ sudo id .\" +ok+ _filter_dbg .\" +ok+ _get_config _get_endian _machine_id _pstree_all _run_purify .\" +ok+ _filter_ls _localhost _filesize _get_fqdn _get_port gitignore -.\" +ok+ _try_pmlc _check_ dinking tmparch addrs _fail repo _ipv Sssh pre TT +.\" +ok+ _try_pmlc _check_ dinking addrs _fail repo _ipv Sssh pre TT .\" +ok+ br {from
} .\" +ok+ fc te {selinux file suffixes} .\" +ok+ PCPQA_SYSTEMD {from $PCPQA_SYSTEMD} @@ -961,57 +1126,58 @@ General Index|Commands and Scripts|Shell Functions|Shell Variables|Files |**General Index**|**Shell Functions ...**|**Shell Functions ...**|**Shell Functions ...**| |---|---|---|---| -|[PCP](#idx+pcp)|[\_check_job_scheduler](#idx+funcs+checkjobscheduler)|[_filter_valgrind_possibly](#idx+funcs+filtervalgrindpossibly)|[\_setup_purify](#idx+funcs+setuppurify)| -|[PMAPI](#idx+pmapi)|[\_check_key_server](#idx+funcs+checkkeyserver)|[_filter_views](#idx+funcs+filterviews)|[_show_pmie_errors](#idx+funcs+showpmieerrors)| -|[PMCD](#idx+pmcd)|[\_check_key_server_ping](#idx+funcs+checkkeyserverping)|[\_find_free_port](#idx+funcs+findfreeport)|[_show_pmie_exit](#idx+funcs+showpmieexit)| -|[PMDA](#idx+pmda)|[\_check_key_server_version](#idx+funcs+checkkeyserverversion)|[\_find_key_server_modules](#idx+funcs+findkeyservermodules)|[\_sighup_pmcd](#idx+funcs+sighuppmcd)| -|[PMNS](#idx+pmns)|[\_check_key_server_version_offline](#idx+funcs+checkkeyserverversionoffline)|[\_find_key_server_name](#idx+funcs+findkeyservername)|[_sort_pmdumplog_d](#idx+funcs+sortpmdumplogd)| -|**Commands and Scripts**|[\_check_local_primary_archive](#idx+funcs+checklocalprimaryarchive)|[\_find_key_server_search](#idx+funcs+findkeyserversearch)|[\_start_up_pmlogger](#idx+funcs+startuppmlogger)| -|[all-by-group](#idx+cmds+all-by-group)|[\_check_metric](#idx+funcs+checkmetric)|[\_get_config](#idx+funcs+getconfig)|[\_stop_auto_restart](#idx+funcs+stopautorestart)| -|[appchange](#idx+cmds+appchange)|[\_check_purify](#idx+funcs+checkpurify)|[\_get_endian](#idx+funcs+getendian)|[\_systemctl_status](#idx+funcs+systemctlstatus)| -|[bad-by-group](#idx+cmds+bad-by-group)|[\_check_search](#idx+funcs+checksearch)|[\_get_fqdn](#idx+funcs+getfqdn)|[\_triage_pmcd](#idx+funcs+triagepmcd)| -|[check](#idx+cmds+check)|[\_check_series](#idx+funcs+checkseries)|[\_get_libpcp_config](#idx+funcs+getlibpcpconfig)|[\_triage_wait_point](#idx+funcs+triagewaitpoint)| -|[check.app.ok](#idx+cmds+check.app.ok)|[\_check_valgrind](#idx+funcs+checkvalgrind)|[\_get_port](#idx+funcs+getport)|[\_try_pmlc](#idx+funcs+trypmlc)| -|[check-auto](#idx+cmds+check-auto)|[\_clean_display](#idx+funcs+cleandisplay)|[\_get_primary_logger_pid](#idx+funcs+getprimaryloggerpid)|[_value_filter_any](#idx+funcs+valuefilterany)| -|[check-flakey](#idx+cmds+check-flakey)|[\_cleanup_pmda](#idx+funcs+cleanuppmda)|[\_get_word_size](#idx+funcs+getwordsize)|[_value_filter_nonzero](#idx+funcs+valuefilternonzero)| -|[check-group](#idx+cmds+check-group)|[_cull_dup_lines](#idx+funcs+cullduplines)|[\_host_to_fqdn](#idx+funcs+hosttofqdn)|[\_wait_for_pmcd](#idx+funcs+waitforpmcd)| -|[check-pdu-coverage](#idx+cmds+check-pdu-coverage)|[\_disable_loggers](#idx+funcs+disableloggers)|[\_host_to_ipaddr](#idx+funcs+hosttoipaddr)|[\_wait_for_pmcd_stop](#idx+funcs+waitforpmcdstop)| -|[check-setup](#idx+cmds+check-setup)|[\_domain_name](#idx+funcs+domainname)|[\_host_to_ipv6addrs](#idx+funcs+hosttoipv6addrs)|[\_wait_for_pmie](#idx+funcs+waitforpmie)| -|[check-vars](#idx+cmds+check-vars)|[\_exit](#idx+funcs+exit)|[_instances_filter_any](#idx+funcs+instancesfilterany)|[\_wait_for_pmlogger](#idx+funcs+waitforpmlogger)| -|[cull-pmlogger-config](#idx+cmds+cull-pmlogger-config)|[\_fail](#idx+funcs+fail)|[_instances_filter_exact](#idx+funcs+instancesfilterexact)|[\_wait_for_pmproxy](#idx+funcs+waitforpmproxy)| -|[daily-cleanup](#idx+cmds+daily-cleanup)|[\_filesize](#idx+funcs+filesize)|[_instances_filter_nonzero](#idx+funcs+instancesfilternonzero)|[\_wait_for_pmproxy_logfile](#idx+funcs+waitforpmproxylogfile)| -|[find-app](#idx+cmds+find-app)|[_filterall_pcp_start](#idx+funcs+filterallpcpstart)|[_inst_value_filter](#idx+funcs+instvaluefilter)|[\_wait_for_pmproxy_metrics](#idx+funcs+waitforpmproxymetrics)| -|[find-bound](#idx+cmds+find-bound)|[_filter_compiler_babble](#idx+funcs+filtercompilerbabble)|[\_ipaddr_to_host](#idx+funcs+ipaddrtohost)|[\_wait_for_port](#idx+funcs+waitforport)| -|[find-metric](#idx+cmds+find-metric)|[_filter_console](#idx+funcs+filterconsole)|[\_ipv6_localhost](#idx+funcs+ipv6localhost)|[\_wait_pmcd_end](#idx+funcs+waitpmcdend)| -|[flakey-summary](#idx+cmds+flakey-summary)|[_filter_cron_scripts](#idx+funcs+filtercronscripts)|[\_libvirt_is_ok](#idx+funcs+libvirtisok)|[\_wait_pmie_end](#idx+funcs+waitpmieend)| -|[getpmcdhosts](#idx+cmds+getpmcdhosts)|[_filter_dbg](#idx+funcs+filterdbg)|[\_machine_id](#idx+funcs+machineid)|[\_wait_pmlogctl](#idx+funcs+waitpmlogctl)| -|[grind](#idx+cmds+grind)|[_filter_dumpresult](#idx+funcs+filterdumpresult)|[\_make_helptext](#idx+funcs+makehelptext)|[\_wait_pmlogger_end](#idx+funcs+waitpmloggerend)| -|[grind-pmda](#idx+cmds+grind-pmda)|[\_filter_helgrind](#idx+funcs+filterhelgrind)|[\_make_proc_stat](#idx+funcs+makeprocstat)|[\_wait_pmproxy_end](#idx+funcs+waitpmproxyend)| -|[group-stats](#idx+cmds+group-stats)|[\_filter_init_distro](#idx+funcs+filterinitdistro)|[\_need_metric](#idx+funcs+needmetric)|[\_wait_process_end](#idx+funcs+waitprocessend)| -|[mk.localconfig](#idx+cmds+mk.localconfig)|[_filter_install](#idx+funcs+filterinstall)|[\_notrun](#idx+funcs+notrun)|[\_webapi_header_filter](#idx+funcs+webapiheaderfilter)| -|[mk.logfarm](#idx+cmds+mk.logfarm)|[_filter_ls](#idx+funcs+filterls)|[\_path_readable](#idx+funcs+pathreadable)|[\_webapi_response_filter](#idx+funcs+webapiresponsefilter)| -|[mk.pcpversion](#idx+cmds+mk.pcpversion)|[_filter_optional_labels](#idx+funcs+filteroptionallabels)|[\_pid_in_container](#idx+funcs+pidincontainer)|[\_within_tolerance](#idx+funcs+withintolerance)| -|[mk.qa_hosts](#idx+cmds+mk.qahosts)|[_filter_optional_pmda_instances](#idx+funcs+filteroptionalpmdainstances)|[\_prefer_valgrind](#idx+funcs+prefervalgrind)|[\_writable_primary_logger](#idx+funcs+writableprimarylogger)| -|[mk.variant](#idx+cmds+mk.variant)|[_filter_optional_pmdas](#idx+funcs+filteroptionalpmdas)|[\_prepare_pmda](#idx+funcs+preparepmda)|**Shell Variables**| -|[new](#idx+cmds+new)|[_filter_pcp_restart](#idx+funcs+filterpcprestart)|[\_prepare_pmda_install](#idx+funcs+preparepmdainstall)|[$here](#idx+vars+here)| -|[new-dup](#idx+cmds+new-dup)|[_filter_pcp_start](#idx+funcs+filterpcpstart)|[\_prepare_pmda_mmv](#idx+funcs+preparepmdammv)|[$PCP_\*](#idx+vars+pcpstar)| -|[new-grind](#idx+cmds+new-grind)|[_filter_pcp_start_distro](#idx+funcs+filterpcpstartdistro)|[\_private_pmcd](#idx+funcs+privatepmcd)|[$PCPQA_IN_CI](#idx+vars+pcpqainci)| -|[new-seqs](#idx+cmds+new-seqs)|[_filter_pcp_stop](#idx+funcs+filterpcpstop)|[\_ps_tcp_port](#idx+funcs+pstcpport)|[$PCPQA_SYSTEMD](#idx+vars+pcpqasystemd)| -|[really-retire](#idx+cmds+really-retire)|[_filter_pmcd_log](#idx+funcs+filterpmcdlog)|[\_pstree_all](#idx+funcs+pstreeall)|[$seq](#idx+vars+seq)| -|[recheck](#idx+cmds+recheck)|[_filter_pmda_install](#idx+funcs+filterpmdainstall)|[\_pstree_oneline](#idx+funcs+pstreeoneline)|[$seq_full](#idx+vars+seqfull)| -|[remake](#idx+cmds+remake)|[_filter_pmda_remove](#idx+funcs+filterpmdaremove)|[_quote_filter](#idx+funcs+quotefilter)|[$status](#idx+vars+status)| -|[sameas](#idx+cmds+sameas)|[_filter_pmdumplog](#idx+funcs+filterpmdumplog)|[\_remove_job_scheduler](#idx+funcs+removejobscheduler)|[$sudo](#idx+vars+sudo)| -|[show-me](#idx+cmds+show-me)|[_filter_pmdumptext](#idx+funcs+filterpmdumptext)|[\_restore_auto_restart](#idx+funcs+restoreautorestart)|[$tmp](#idx+vars+tmp)| -|[var-use](#idx+cmds+var-use)|[_filter_pmie_log](#idx+funcs+filterpmielog)|[\_restore_config](#idx+funcs+restoreconfig)|**Files**| -|**Shell Functions**|[_filter_pmie_start](#idx+funcs+filterpmiestart)|[\_restore_job_scheduler](#idx+funcs+restorejobscheduler)|[$seq_full](#idx+files+seqfull)| -|[\_all_hostnames](#idx+funcs+allhostnames)|[_filter_pmie_stop](#idx+funcs+filterpmiestop)|[\_restore_loggers](#idx+funcs+restoreloggers)|[check.log](#idx+files+check.log)| -|[\_all_ipaddrs](#idx+funcs+allipaddrs)|[_filter_pmlogger_log](#idx+funcs+filterpmloggerlog)|[\_restore_pmda_install](#idx+funcs+restorepmdainstall)|[check.time](#idx+files+check.time)| -|[\_arch_start](#idx+funcs+archstart)|[_filter_pmproxy_log](#idx+funcs+filterpmproxylog)|[\_restore_pmda_mmv](#idx+funcs+restorepmdammv)|[common](#idx+files+common)| -|[\_avail_metric](#idx+funcs+availmetric)|[_filter_pmproxy_start](#idx+funcs+filterpmproxystart)|[\_restore_pmlogger_control](#idx+funcs+restorepmloggercontrol)|[common.\*](#idx+files+common.star)| -|[\_change_config](#idx+funcs+changeconfig)|[_filter_pmproxy_stop](#idx+funcs+filterpmproxystop)|[\_restore_primary_logger](#idx+funcs+restoreprimarylogger)|[group](#idx+files+group)| -|[\_check_64bit_platform](#idx+funcs+check64bitplatform)|[_filter_post](#idx+funcs+filterpost)|[\_run_helgrind](#idx+funcs+runhelgrind)|[localconfig](#idx+files+localconfig)| -|[\_check_agent](#idx+funcs+checkagent)|[\_filter_purify](#idx+funcs+filterpurify)|[\_run_purify](#idx+funcs+runpurify)|[qa_hosts](#idx+files+qahosts)| -|[\_check_core](#idx+funcs+checkcore)|[_filter_slow_pmie](#idx+funcs+filterslowpmie)|[\_run_valgrind](#idx+funcs+runvalgrind)|[qa_hosts.primary](#idx+files+qahosts.primary)| -|[\_check_display](#idx+funcs+checkdisplay)|[_filter_top_pmns](#idx+funcs+filtertoppmns)|[\_save_config](#idx+funcs+saveconfig)|[triaged](#idx+files+triaged)| -|[\_check_freespace](#idx+funcs+checkfreespace)|[_filter_torture_api](#idx+funcs+filtertortureapi)|[\_service](#idx+funcs+service)| -|[\_check_helgrind](#idx+funcs+checkhelgrind)|[\_filter_valgrind](#idx+funcs+filtervalgrind)|[\_set_dsosuffix](#idx+funcs+setdsosuffix)| +|[PCP](#idx+pcp)|[\_check_key_server_ping](#idx+funcs+checkkeyserverping)|[\_find_key_server_modules](#idx+funcs+findkeyservermodules)|[_sort_pmdumplog_d](#idx+funcs+sortpmdumplogd)| +|[PMAPI](#idx+pmapi)|[\_check_key_server_version](#idx+funcs+checkkeyserverversion)|[\_find_key_server_name](#idx+funcs+findkeyservername)|[\_start_up_pmlogger](#idx+funcs+startuppmlogger)| +|[PMCD](#idx+pmcd)|[\_check_key_server_version_offline](#idx+funcs+checkkeyserverversionoffline)|[\_find_key_server_search](#idx+funcs+findkeyserversearch)|[\_stop_auto_restart](#idx+funcs+stopautorestart)| +|[PMDA](#idx+pmda)|[\_check_local_primary_archive](#idx+funcs+checklocalprimaryarchive)|[\_get_config](#idx+funcs+getconfig)|[\_systemctl_status](#idx+funcs+systemctlstatus)| +|[PMNS](#idx+pmns)|[\_check_metric](#idx+funcs+checkmetric)|[\_get_endian](#idx+funcs+getendian)|[\_triage_pmcd](#idx+funcs+triagepmcd)| +|**Commands and Scripts**|[\_check_purify](#idx+funcs+checkpurify)|[\_get_fqdn](#idx+funcs+getfqdn)|[\_triage_wait_point](#idx+funcs+triagewaitpoint)| +|[all-by-group](#idx+cmds+all-by-group)|[\_check_search](#idx+funcs+checksearch)|[\_get_libpcp_config](#idx+funcs+getlibpcpconfig)|[\_try_pmlc](#idx+funcs+trypmlc)| +|[appchange](#idx+cmds+appchange)|[\_check_series](#idx+funcs+checkseries)|[\_get_port](#idx+funcs+getport)|[_value_filter_any](#idx+funcs+valuefilterany)| +|[bad-by-group](#idx+cmds+bad-by-group)|[\_check_valgrind](#idx+funcs+checkvalgrind)|[\_get_primary_logger_pid](#idx+funcs+getprimaryloggerpid)|[_value_filter_nonzero](#idx+funcs+valuefilternonzero)| +|[check](#idx+cmds+check)|[\_clean_display](#idx+funcs+cleandisplay)|[\_get_word_size](#idx+funcs+getwordsize)|[\_wait_for_pmcd](#idx+funcs+waitforpmcd)| +|[check.app.ok](#idx+cmds+check.app.ok)|[\_cleanup_pmda](#idx+funcs+cleanuppmda)|[\_host_to_fqdn](#idx+funcs+hosttofqdn)|[\_wait_for_pmcd_stop](#idx+funcs+waitforpmcdstop)| +|[check-auto](#idx+cmds+check-auto)|[_cull_dup_lines](#idx+funcs+cullduplines)|[\_host_to_ipaddr](#idx+funcs+hosttoipaddr)|[\_wait_for_pmie](#idx+funcs+waitforpmie)| +|[check-flakey](#idx+cmds+check-flakey)|[\_disable_loggers](#idx+funcs+disableloggers)|[\_host_to_ipv6addrs](#idx+funcs+hosttoipv6addrs)|[\_wait_for_pmlogger](#idx+funcs+waitforpmlogger)| +|[check-group](#idx+cmds+check-group)|[\_domain_name](#idx+funcs+domainname)|[_instances_filter_any](#idx+funcs+instancesfilterany)|[\_wait_for_pmproxy](#idx+funcs+waitforpmproxy)| +|[check-pdu-coverage](#idx+cmds+check-pdu-coverage)|[\_exit](#idx+funcs+exit)|[_instances_filter_exact](#idx+funcs+instancesfilterexact)|[\_wait_for_pmproxy_logfile](#idx+funcs+waitforpmproxylogfile)| +|[check-setup](#idx+cmds+check-setup)|[\_fail](#idx+funcs+fail)|[_instances_filter_nonzero](#idx+funcs+instancesfilternonzero)|[\_wait_for_pmproxy_metrics](#idx+funcs+waitforpmproxymetrics)| +|[check-vars](#idx+cmds+check-vars)|[\_filesize](#idx+funcs+filesize)|[_inst_value_filter](#idx+funcs+instvaluefilter)|[\_wait_for_port](#idx+funcs+waitforport)| +|[cull-pmlogger-config](#idx+cmds+cull-pmlogger-config)|[_filterall_pcp_start](#idx+funcs+filterallpcpstart)|[\_ipaddr_to_host](#idx+funcs+ipaddrtohost)|[\_wait_pmcd_end](#idx+funcs+waitpmcdend)| +|[daily-cleanup](#idx+cmds+daily-cleanup)|[_filter_compiler_babble](#idx+funcs+filtercompilerbabble)|[\_ipv6_localhost](#idx+funcs+ipv6localhost)|[\_wait_pmie_end](#idx+funcs+waitpmieend)| +|[find-app](#idx+cmds+find-app)|[_filter_console](#idx+funcs+filterconsole)|[\_libvirt_is_ok](#idx+funcs+libvirtisok)|[\_wait_pmlogctl](#idx+funcs+waitpmlogctl)| +|[find-bound](#idx+cmds+find-bound)|[_filter_cron_scripts](#idx+funcs+filtercronscripts)|[\_machine_id](#idx+funcs+machineid)|[\_wait_pmlogger_end](#idx+funcs+waitpmloggerend)| +|[find-metric](#idx+cmds+find-metric)|[_filter_dbg](#idx+funcs+filterdbg)|[\_make_helptext](#idx+funcs+makehelptext)|[\_wait_pmproxy_end](#idx+funcs+waitpmproxyend)| +|[flakey-summary](#idx+cmds+flakey-summary)|[_filter_dumpresult](#idx+funcs+filterdumpresult)|[\_make_proc_stat](#idx+funcs+makeprocstat)|[\_wait_process_end](#idx+funcs+waitprocessend)| +|[getpmcdhosts](#idx+cmds+getpmcdhosts)|[\_filter_helgrind](#idx+funcs+filterhelgrind)|[\_need_metric](#idx+funcs+needmetric)|[\_webapi_header_filter](#idx+funcs+webapiheaderfilter)| +|[grind](#idx+cmds+grind)|[\_filter_init_distro](#idx+funcs+filterinitdistro)|[\_notrun](#idx+funcs+notrun)|[\_webapi_response_filter](#idx+funcs+webapiresponsefilter)| +|[grind-pmda](#idx+cmds+grind-pmda)|[_filter_install](#idx+funcs+filterinstall)|[\_path_readable](#idx+funcs+pathreadable)|[\_within_tolerance](#idx+funcs+withintolerance)| +|[group-stats](#idx+cmds+group-stats)|[_filter_ls](#idx+funcs+filterls)|[\_pid_in_container](#idx+funcs+pidincontainer)|[\_writable_primary_logger](#idx+funcs+writableprimarylogger)| +|[mk.localconfig](#idx+cmds+mk.localconfig)|[_filter_optional_labels](#idx+funcs+filteroptionallabels)|[\_prefer_valgrind](#idx+funcs+prefervalgrind)|**Shell Variables**| +|[mk.logfarm](#idx+cmds+mk.logfarm)|[_filter_optional_pmda_instances](#idx+funcs+filteroptionalpmdainstances)|[\_prepare_pmda](#idx+funcs+preparepmda)|[$here](#idx+vars+here)| +|[mk.qa_hosts](#idx+cmds+mk.qahosts)|[_filter_optional_pmdas](#idx+funcs+filteroptionalpmdas)|[\_prepare_pmda_install](#idx+funcs+preparepmdainstall)|[$PCP_\*](#idx+vars+pcpstar)| +|[mk.variant](#idx+cmds+mk.variant)|[_filter_pcp_restart](#idx+funcs+filterpcprestart)|[\_prepare_pmda_mmv](#idx+funcs+preparepmdammv)|[$PCPQA_CLOSE_X_SERVER](#idx+vars+pcpqaclosexserver)| +|[new](#idx+cmds+new)|[_filter_pcp_start](#idx+funcs+filterpcpstart)|[\_private_pmcd](#idx+funcs+privatepmcd)|[$PCPQA_FAR_PMCD](#idx+vars+pcpqafarpmcd)| +|[new-dup](#idx+cmds+new-dup)|[_filter_pcp_start_distro](#idx+funcs+filterpcpstartdistro)|[\_ps_tcp_port](#idx+funcs+pstcpport)|[$PCPQA_HYPHEN_HOST](#idx+vars+pcpqahyphenhost)| +|[new-grind](#idx+cmds+new-grind)|[_filter_pcp_stop](#idx+funcs+filterpcpstop)|[\_pstree_all](#idx+funcs+pstreeall)|[$PCPQA_IN_CI](#idx+vars+pcpqainci)| +|[new-seqs](#idx+cmds+new-seqs)|[_filter_pmcd_log](#idx+funcs+filterpmcdlog)|[\_pstree_oneline](#idx+funcs+pstreeoneline)|[$PCPQA_SYSTEMD](#idx+vars+pcpqasystemd)| +|[really-retire](#idx+cmds+really-retire)|[_filter_pmda_install](#idx+funcs+filterpmdainstall)|[_quote_filter](#idx+funcs+quotefilter)|[$seq](#idx+vars+seq)| +|[recheck](#idx+cmds+recheck)|[_filter_pmda_remove](#idx+funcs+filterpmdaremove)|[\_remove_job_scheduler](#idx+funcs+removejobscheduler)|[$seq_full](#idx+vars+seqfull)| +|[remake](#idx+cmds+remake)|[_filter_pmdumplog](#idx+funcs+filterpmdumplog)|[\_restore_auto_restart](#idx+funcs+restoreautorestart)|[$status](#idx+vars+status)| +|[sameas](#idx+cmds+sameas)|[_filter_pmdumptext](#idx+funcs+filterpmdumptext)|[\_restore_config](#idx+funcs+restoreconfig)|[$sudo](#idx+vars+sudo)| +|[show-me](#idx+cmds+show-me)|[_filter_pmie_log](#idx+funcs+filterpmielog)|[\_restore_job_scheduler](#idx+funcs+restorejobscheduler)|[$tmp](#idx+vars+tmp)| +|[var-use](#idx+cmds+var-use)|[_filter_pmie_start](#idx+funcs+filterpmiestart)|[\_restore_loggers](#idx+funcs+restoreloggers)|**Files**| +|**Shell Functions**|[_filter_pmie_stop](#idx+funcs+filterpmiestop)|[\_restore_pmda_install](#idx+funcs+restorepmdainstall)|[$seq_full](#idx+files+seqfull)| +|[\_all_hostnames](#idx+funcs+allhostnames)|[_filter_pmlogger_log](#idx+funcs+filterpmloggerlog)|[\_restore_pmda_mmv](#idx+funcs+restorepmdammv)|[check.log](#idx+files+check.log)| +|[\_all_ipaddrs](#idx+funcs+allipaddrs)|[_filter_pmproxy_log](#idx+funcs+filterpmproxylog)|[\_restore_pmlogger_control](#idx+funcs+restorepmloggercontrol)|[check.time](#idx+files+check.time)| +|[\_arch_start](#idx+funcs+archstart)|[_filter_pmproxy_start](#idx+funcs+filterpmproxystart)|[\_restore_primary_logger](#idx+funcs+restoreprimarylogger)|[common](#idx+files+common)| +|[\_avail_metric](#idx+funcs+availmetric)|[_filter_pmproxy_stop](#idx+funcs+filterpmproxystop)|[\_run_helgrind](#idx+funcs+runhelgrind)|[common.\*](#idx+files+common.star)| +|[\_change_config](#idx+funcs+changeconfig)|[_filter_post](#idx+funcs+filterpost)|[\_run_purify](#idx+funcs+runpurify)|[common.config](#idx+files+common.config)| +|[\_check_64bit_platform](#idx+funcs+check64bitplatform)|[\_filter_purify](#idx+funcs+filterpurify)|[\_run_valgrind](#idx+funcs+runvalgrind)|[group](#idx+files+group)| +|[\_check_agent](#idx+funcs+checkagent)|[_filter_slow_pmie](#idx+funcs+filterslowpmie)|[\_save_config](#idx+funcs+saveconfig)|[localconfig](#idx+files+localconfig)| +|[\_check_core](#idx+funcs+checkcore)|[_filter_top_pmns](#idx+funcs+filtertoppmns)|[\_service](#idx+funcs+service)|[qa_hosts](#idx+files+qahosts)| +|[\_check_display](#idx+funcs+checkdisplay)|[_filter_torture_api](#idx+funcs+filtertortureapi)|[\_set_dsosuffix](#idx+funcs+setdsosuffix)|[qa_hosts.primary](#idx+files+qahosts.primary)| +|[\_check_freespace](#idx+funcs+checkfreespace)|[\_filter_valgrind](#idx+funcs+filtervalgrind)|[\_setup_purify](#idx+funcs+setuppurify)|[triaged](#idx+files+triaged)| +|[\_check_helgrind](#idx+funcs+checkhelgrind)|[_filter_valgrind_possibly](#idx+funcs+filtervalgrindpossibly)|[_show_pmie_errors](#idx+funcs+showpmieerrors)|| +|[\_check_job_scheduler](#idx+funcs+checkjobscheduler)|[_filter_views](#idx+funcs+filterviews)|[_show_pmie_exit](#idx+funcs+showpmieexit)|| +|[\_check_key_server](#idx+funcs+checkkeyserver)|[\_find_free_port](#idx+funcs+findfreeport)|[\_sighup_pmcd](#idx+funcs+sighuppmcd)|| diff --git a/qa/README b/qa/README index c53f14e292a..7ee618ec34e 100644 --- a/qa/README +++ b/qa/README @@ -3,239 +3,3 @@ Notes on using the PCP QA Suite Refer to COOKBOOK.md which is a complete description of the PCP QA infrastructure and how to use it. - -Preliminaries -------------- - -Basic getting started ---------------------- - - There is some local configuration needed ... check the file - "common.config" ... this script uses heuristics to set a number of - interesting variables, specifically: - - $PCPQA_CLOSE_X_SERVER - The $DISPLAY setting for an X server that is willing to accept - connections from X clients running on the local machine. This is - optional, and if not set any QA tests dependent on this will - be skipped. - - $PCPQA_FAR_PMCD - The hostname for a host running pmcd, but the host is preferably - a long way away (over a WAN) for timing test. This is optional, - and if not set any QA tests dependent on this will be skipped. - - $PCPQA_HYPHEN_HOST - The hostname for a host running pmcd, with a hyphen (-) in the - hostname. This is optional, and if not set any QA tests dependent - on this will be skipped. - - Next, mk.qa_hosts is a script that includes heuristics for selecting - and sorting the list of potential remote PCP QA hosts (qa_hosts.primary). - Refer to the comments in qa_hosts.primary, and make appropriate changes. - - For each of the potential remote PCP QA hosts, the following must be - set up: - - (a) PCP installed from packages, - - (b) pmcd(1) running, - - (c) a login for the user "pcpqa" needs to be created, and then set - up in such a way that ssh/scp will work without the need for any - password, i.e. these sorts of commands - $ ssh pcpqa@pcp-qa-host some-command - $ scp some-file pcpqa@pcp-qa-host:some-dir - must work correctly when run from the local host with no - interactive input and no Password: prompt - - On systems enforcing selinux it may be necessary to execute - the following command to make this work: - $ sudo chcon -R unconfined_u:object_r:ssh_home_t:s0 ~pcpqa/.ssh - so that the ssh_home_t attribute is set on ~pcpqa/.ssh and - all the files below there. - - The "pcpqa" user's environment must also be initialized so that - their shell's path includes all of the PCP binary directories - (identify these with $ grep BIN /etc/pcp.conf), so that all - PCP commands are executable without full pathnames. Of most - concern would be auxilliary directory (usually /usr/pcp/bin, - /usr/share/pcp/bin or /usr/libexec/pcp/bin) where commands like - pmlogger(1), pmhostname(1), mkaf(1), etc.) are installed. - - And finally, the "pcpqa" user needs to be included in the group - "pcp". - - Once you've modified common.config and qa_hosts.primary, then run - "./check-setup" to validate the settings. - - For test 051 we need five local hostnames that are valid, although PCP - does not need to be installed there, nor pmcd(1) running. The five - hosts listed in 051.hosts (the comments at the start of this file - explain what is required) should suffice for most installations. - - Some tests are graphical, and wish to make use of your display. - For authentication to success, you may find you need to perform some - access list updates, e.g. "xhost +local:" for such tests to pass - (e.g. test 325). - - You can now verify your QA setup, by running: - - ./check 000 - - The first time you run "check" (see below) it will descend into the - src directory (see below) and make all of the QA test programs and - dynamic PCP archives, so some patience may be required. - - If test 000 fails, it may be that you have locally developed PMDAs - or optional PMDAs installed. Edit common.filter, and modify the - _filter_top_pmns() procedure to strip the top-level name components - for any new metric names (there are lots of examples already there) - ... if these are distributed (shipped) PMDAs, please update the list. - - Firewalls can get in the way. In addition to the standard pmcd port(s) - (TCP ports 44321, 44322 and 44323) one needs to open ports to allow - incoming connections and outgoing connections on a range of ports - for pmdatrace, pmlogger connections via pmlc, and some QA tests. - Opening the TCP range 4320 to 4350 (inclusive) should suffice. - - If the avahi services are to be tested, then the firewall also needs - to allow mDNS traffic (UDP, port 5353), for both external and internal - connections. - - -Doing the Real Work -------------------- - - check ... - This script runs tests and verifies the output. In general, test NNN - is expected to terminate with an exit status of 0, no core file and - produce output that matches that in the file NNN.out ... failures - leave the current output in NNN.out.bad, and may leave a more - verbose trace that is useful for diagnosing failures in NNN.full. - - The command line options to check are: - - NNN run test NNN (leading zeros will be added as necessary to - the test sequence number, so 00N and N are equivalent) - - NNN- all tests >= NNN - - NNN-MMM all tests in the range NNN ... MMM - - -l diffs in line mode (the default is to use xdiff or similar) - - -n show me, do not run any tests - - -q quick mode, by-pass the initial setup integrity checks - (recommended that you do not use this the first time, nor - if the last run test failed) - - -g xxx include tests from a named group (xxx) ... refer to the - "groups" file - - -x xxx exclude tests from a named group (xxx) ... refer to the - "groups" file - - If none of the NNN variants or -g is specified, then the default - is to run all tests. - - Each of the NNN scripts that may be run by check follows the same - basic scheme: - - - include some optional shell procedures and set variables to - define the local configuration options - - optionally, check the run-time environment to see if it makes - sense to run the test at all, and if not echo the reason to the - file NNN.notrun and exit ... check will notice the NNN.notrun - file and skip any testing of the exit status or comparison - of output - - define $tmp as a prefix to be used for all temporary files, and - install a trap handler to remove temporary files when the scipt - exits - - optionally, check the run-time environment to choose one of - a number of expected output formats, and link the selected - file to NNN.out ... if the same output is expected in all - environments, the NNN.out file will already exist as part of - the PCP QA distribution - - run the test - - optionally save all the output in the file NNN.full ... this - is only useful for debugging test failures - - filter the output to produce deterministic output that will - match NNN.out if the test has been successful - - remake NNN - This script creates a new NNN.out file. Since the NNN.out files - are precious, and reflect the state of the qualified and expected - output, they should typically not be changed unless some change - has been made to the NNN script or the filters it uses. - - new - Make sure "group" is writeable, then run "new" to create the - skeletal framework of a new test. - - It is strongly suggested that you base your test on an existing test - ... pay particular attention to making the output deterministic - so the test uses the "not run" protocols (see 009 and check for - examples) to avoid running the test (and hence failing) if an - optional application, feature or platform is not available, and - uses appropriate filters (see common.filter for lots of useful - filters already packaged as shell procedures). - - show-me ... - Report differences between the NNN.out and NNN.out.bad files. - By default, uses all of the NNN.out.bad files in the current - directory, but can also specify test numbers or ranges of test - numbers on the command line. - - Other options may be used to fetch good and bad output files from - various exotic remote locations (refer to the script). - - -Make in the src Directory ------------------------------ - - The src directory contains a number of test applications that are - designed to exercise some of the more exotic corners of the PCP - functionality. - - In making these applications, you may see this ... - - Error: trace_dev.h and ../../src/include/trace_dev.h are different! - make: [trace_dev.h] Error 1 (ignored) - - this is caused by the source for the pcp_trace library being out of sync - with the src applications. If this happens, please ... - - 1. cd src - 2. diff -u trace_dev.h ../../src/include/trace_dev.h - and mail the differences to pcp@groups.io so we can refine the - Makefiles to avoid cosmetic differences - 3. mv trace_dev.h trace_dev.h.orig - cp ../../src/include/trace_dev.h trace_dev.h - 4. make - - -008 Issues ----------- - - Test 008 depends on the local disk configuration, so you need to - make your own 008.out file (or rather a variant that 008 will link to - 008.out when the test is run). Refer to the 008 script, but here is - the basic recipe: - - $ touch 008.out.`hostname` - $ ./remake 008 - $ mv 008.out 008.out.`hostname` - - Be aware that it can be adversely influenced by temporary disks like - USB sticks, mobile phones, or other transient storage that may come - and go in your test systems. - - -Fixes ------ - - If you find something that does not work, and fix it, or create - additional QA tests, please send the details to pcp@groups.io. - From 34b4f13cfafe558c0b4fc1ca82db8b042e74799d Mon Sep 17 00:00:00 2001 From: Nathan Scott Date: Thu, 19 Mar 2026 21:45:38 +1100 Subject: [PATCH 21/31] build: retire use of Avahi in libpcp and services Disabled for a long time, now retired fully. For very few, if any, users Avahi added build complexity, security risk, unwanted runtime dependencies on core PCP (linked into libpcp), additional systemd service dependencies, and of course a number of QA tests and common code to check it (long since untended). Resolves #2526 --- build/nix/package.nix | 1 - build/rpm/GNUmakefile | 1 - build/rpm/pcp.spec.in | 3 - build/rpm/redhat.spec | 1 - configure | 264 +----- configure.ac | 39 - debian/control.pcp | 7 +- docs/HowTos/nix/index.rst | 1 - lgtm.yml | 2 - man/man1/pmcd.1 | 6 +- man/man1/pmfind.1 | 16 +- man/man1/pmproxy.1 | 6 +- man/man3/pmdiscoverservices.3 | 17 +- qa/283 | 14 - qa/724 | 34 +- qa/724.out | 11 +- qa/775 | 68 +- qa/775.out | 26 +- qa/840 | 23 +- qa/840.out | 6 +- qa/946 | 66 +- qa/946.out | 27 +- qa/950 | 33 +- qa/950.out | 6 +- qa/README | 4 - qa/admin/other-packages/manifest | 22 - qa/admin/other-packages/skip | 5 - qa/admin/other-packages/skip.debian8 | 1 - qa/admin/other-packages/skip.ubuntu1604 | 1 - qa/admin/other-packages/skip.ubuntu1804 | 1 - qa/admin/other-packages/unavailable | 50 +- .../package-lists/AmazonLinux+2023+aarch64 | 2 - .../package-lists/AmazonLinux+2023+x86_64 | 2 - qa/admin/package-lists/ArchLinux++x86_64 | 1 - qa/admin/package-lists/CentOS+7+x86_64 | 2 - qa/admin/package-lists/CentOS+Stream10+x86_64 | 2 - qa/admin/package-lists/CentOS+Stream8+x86_64 | 1 - qa/admin/package-lists/CentOS+Stream9+x86_64 | 2 - qa/admin/package-lists/Debian+11+x86_64 | 2 - qa/admin/package-lists/Debian+12+aarch64 | 2 - qa/admin/package-lists/Debian+12+i686 | 2 - qa/admin/package-lists/Debian+12+x86_64 | 2 - qa/admin/package-lists/Debian+13+i686 | 2 - qa/admin/package-lists/Debian+13+x86_64 | 2 - qa/admin/package-lists/Debian+14+x86_64 | 2 - qa/admin/package-lists/Fedora+42+aarch64 | 2 - qa/admin/package-lists/Fedora+42+x86_64 | 2 - qa/admin/package-lists/Fedora+43+aarch64 | 2 - qa/admin/package-lists/Fedora+43+x86_64 | 2 - qa/admin/package-lists/Fedora+44+aarch64 | 2 - qa/admin/package-lists/Fedora+44+x86_64 | 2 - qa/admin/package-lists/Fedora+45+aarch64 | 2 - qa/admin/package-lists/Fedora+45+x86_64 | 2 - qa/admin/package-lists/FreeBSD+14+amd64 | 2 - qa/admin/package-lists/FreeBSD+14+i386 | 2 - qa/admin/package-lists/FreeBSD+15+amd64 | 2 - qa/admin/package-lists/MX+23.6+x86_64 | 2 - qa/admin/package-lists/OpenBSD+7.6+i386 | 2 - qa/admin/package-lists/OpenBSD+7.7+amd64 | 2 - qa/admin/package-lists/OpenBSD+7.8+i386 | 2 - .../package-lists/OpenIndiana+2025.10+i86pc | 1 - qa/admin/package-lists/RHEL+10+x86_64 | 2 - qa/admin/package-lists/RHEL+9+x86_64 | 2 - qa/admin/package-lists/Ubuntu+18.04+i686 | 2 - qa/admin/package-lists/Ubuntu+18.04+x86_64 | 2 - qa/admin/package-lists/Ubuntu+20.04+x86_64 | 2 - qa/admin/package-lists/Ubuntu+22.04+x86_64 | 2 - qa/admin/package-lists/Ubuntu+24.04+any | 2 - qa/admin/package-lists/Ubuntu+24.04+x86_64 | 2 - qa/admin/package-lists/openSUSE+15.6+x86_64 | 2 - qa/admin/package-lists/openSUSE+16.0+x86_64 | 2 - qa/common.discovery | 115 --- qa/common.filter | 3 - qa/group | 15 +- scripts/man-spell | 1 - src/include/builddefs.in | 3 - src/include/pcp/config.h.in | 9 - src/libpcp/doc/GNUmakefile | 2 +- src/libpcp/src/GNUlibrarydefs | 5 - src/libpcp/src/GNUmakefile | 6 +- src/libpcp/src/avahi.c | 806 ------------------ src/libpcp/src/avahi.h | 31 - src/libpcp/src/check-statics | 10 - src/libpcp/src/discovery.c | 16 +- src/libpcp/src/internal.h | 9 +- src/libpcp3/src/GNUlibrarydefs | 5 - src/libpcp3/src/GNUmakefile | 6 +- src/libpcp3/src/avahi.c | 806 ------------------ src/libpcp3/src/avahi.h | 31 - src/libpcp3/src/check-statics | 10 - src/libpcp3/src/discovery.c | 16 +- src/libpcp3/src/include/pcp/config.h.in | 9 - src/libpcp3/src/internal.h | 8 +- src/libpcp_fault/src/GNUmakefile | 6 +- src/libpcp_static/src/GNUmakefile | 6 +- src/pmcd/pmcd.service.in | 2 +- src/pmfind/pmfind.c | 2 +- src/pmproxy/pmproxy.service.in | 2 +- src/selinux/pcp.te | 8 - src/zshrc/_pcp | 5 +- 100 files changed, 147 insertions(+), 2645 deletions(-) delete mode 100644 src/libpcp/src/avahi.c delete mode 100644 src/libpcp/src/avahi.h delete mode 100644 src/libpcp3/src/avahi.c delete mode 100644 src/libpcp3/src/avahi.h diff --git a/build/nix/package.nix b/build/nix/package.nix index 3bc323c225d..282bd1fbcae 100644 --- a/build/nix/package.nix +++ b/build/nix/package.nix @@ -165,7 +165,6 @@ pkgs.stdenv.mkDerivation rec { perl rrdtool ] ++ lib.optionals pkgs.stdenv.isLinux [ - avahi lvm2 ] ++ lib.optionals withSystemd [ systemd diff --git a/build/rpm/GNUmakefile b/build/rpm/GNUmakefile index fe30d157e41..4069c238287 100644 --- a/build/rpm/GNUmakefile +++ b/build/rpm/GNUmakefile @@ -99,7 +99,6 @@ pcp.spec: pcp.spec.in -e's|@enable_systemd@|$(ENABLE_SYSTEMD)|g' \ -e's|@enable_secure@|$(ENABLE_SECURE)|g' \ -e's|@enable_probes@|$(ENABLE_PROBES)|g' \ - -e's|@enable_avahi@|$(ENABLE_AVAHI)|g' \ -e's|@enable_dstat@|$(ENABLE_DSTAT)|g' \ -e's|@enable_qt@|$(ENABLE_QT)|g' \ -e's|@enable_selinux@|$(ENABLE_SELINUX)|g' \ diff --git a/build/rpm/pcp.spec.in b/build/rpm/pcp.spec.in index c900bbb7f64..a985f78c750 100755 --- a/build/rpm/pcp.spec.in +++ b/build/rpm/pcp.spec.in @@ -65,9 +65,6 @@ BuildRequires: procps autoconf bison flex BuildRequires: rpm-build -%if "@enable_avahi@" == "true" -BuildRequires: avahi-devel -%endif %if "@enable_lzma@" == "true" BuildRequires: xz-devel %endif diff --git a/build/rpm/redhat.spec b/build/rpm/redhat.spec index 2695034a82e..485e1a21605 100644 --- a/build/rpm/redhat.spec +++ b/build/rpm/redhat.spec @@ -226,7 +226,6 @@ Obsoletes: pcp-pmda-nvidia < 3.10.5 BuildRequires: make BuildRequires: gcc gcc-c++ BuildRequires: procps autoconf bison flex -BuildRequires: avahi-devel BuildRequires: xz-devel BuildRequires: zlib-devel %if !%{disable_python3} diff --git a/configure b/configure index 2b9e4473ff7..59c76f7242d 100755 --- a/configure +++ b/configure @@ -894,11 +894,6 @@ pcp_systemdsysusers_dir SYSTEMD_SYSUSERSDIR pcp_systemdtmpfiles_dir SYSTEMD_TMPFILESDIR -enable_avahi -enable_discovery -lib_for_avahi -avahi_LIBS -avahi_CFLAGS sanitizer gperftools_LIBS gperftools_CFLAGS @@ -1024,7 +1019,6 @@ with_static_probes with_infiniband with_user with_group -with_discovery with_systemd with_selinux with_qt @@ -1082,8 +1076,6 @@ YACC YFLAGS gperftools_CFLAGS gperftools_LIBS -avahi_CFLAGS -avahi_LIBS SYSTEMD_TMPFILESDIR SYSTEMD_SYSUSERSDIR SYSTEMD_SYSTEMUNITDIR @@ -1768,7 +1760,6 @@ Optional Packages: --with-user user account under which daemons run (default is pcp) --with-group user group under which daemons run (default is pcp) - --with-discovery enable support for service discovery (default is on) --with-systemd enable support for systemd services (default is on) --with-selinux enable support for selinux (default is check) --with-qt enable support for tools requiring Qt (default is @@ -1839,9 +1830,6 @@ Some influential environment variables: C compiler flags for gperftools, overriding pkg-config gperftools_LIBS linker flags for gperftools, overriding pkg-config - avahi_CFLAGS - C compiler flags for avahi, overriding pkg-config - avahi_LIBS linker flags for avahi, overriding pkg-config SYSTEMD_TMPFILESDIR value of tmpfilesdir for systemd, overriding pkg-config SYSTEMD_SYSUSERSDIR @@ -3485,17 +3473,6 @@ fi -# Check whether --with-discovery was given. -if test ${with_discovery+y} -then : - withval=$with_discovery; do_discovery=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-discovery=$withval" -else case e in #( - e) do_discovery=check ;; -esac -fi - - - # Check whether --with-systemd was given. if test ${with_systemd+y} then : @@ -6724,216 +6701,6 @@ if test "x$use_sanitizer" != "xno"; then fi -ac_header= ac_cache= -for ac_item in $ac_header_c_list -do - if test $ac_cache; then - ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" - if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then - printf "%s\n" "#define $ac_item 1" >> confdefs.h - fi - ac_header= ac_cache= - elif test $ac_header; then - ac_cache=$ac_item - else - ac_header=$ac_item - fi -done - - - - - - - - -if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes -then : - -printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h - -fi -if test "x$do_discovery" != "xno" -then : - - # on macOS, dns_sd.h - - # on Linux, aloha Avahi - enable_avahi=true - -pkg_failed=no -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for avahi-client" >&5 -printf %s "checking for avahi-client... " >&6; } - -if test -n "$avahi_CFLAGS"; then - pkg_cv_avahi_CFLAGS="$avahi_CFLAGS" - elif test -n "$PKG_CONFIG"; then - if test -n "$PKG_CONFIG" && \ - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"avahi-client\""; } >&5 - ($PKG_CONFIG --exists --print-errors "avahi-client") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_avahi_CFLAGS=`$PKG_CONFIG --cflags "avahi-client" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes -else - pkg_failed=yes -fi - else - pkg_failed=untried -fi -if test -n "$avahi_LIBS"; then - pkg_cv_avahi_LIBS="$avahi_LIBS" - elif test -n "$PKG_CONFIG"; then - if test -n "$PKG_CONFIG" && \ - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"avahi-client\""; } >&5 - ($PKG_CONFIG --exists --print-errors "avahi-client") 2>&5 - ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_avahi_LIBS=`$PKG_CONFIG --libs "avahi-client" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes -else - pkg_failed=yes -fi - else - pkg_failed=untried -fi - - - -if test $pkg_failed = yes; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi - if test $_pkg_short_errors_supported = yes; then - avahi_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "avahi-client" 2>&1` - else - avahi_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "avahi-client" 2>&1` - fi - # Put the nasty error message in config.log where it belongs - echo "$avahi_PKG_ERRORS" >&5 - - enable_avahi=false -elif test $pkg_failed = untried; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } - enable_avahi=false -else - avahi_CFLAGS=$pkg_cv_avahi_CFLAGS - avahi_LIBS=$pkg_cv_avahi_LIBS - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for avahi_client_new in -lavahi-client" >&5 -printf %s "checking for avahi_client_new in -lavahi-client... " >&6; } -if test ${ac_cv_lib_avahi_client_avahi_client_new+y} -then : - printf %s "(cached) " >&6 -else case e in #( - e) ac_check_lib_save_LIBS=$LIBS -LIBS="-lavahi-client $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. - The 'extern "C"' is for builds by C++ compilers; - although this is not generally supported in C code supporting it here - has little cost and some practical benefit (sr 110532). */ -#ifdef __cplusplus -extern "C" -#endif -char avahi_client_new (void); -int -main (void) -{ -return avahi_client_new (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - ac_cv_lib_avahi_client_avahi_client_new=yes -else case e in #( - e) ac_cv_lib_avahi_client_avahi_client_new=no ;; -esac -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS ;; -esac -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avahi_client_avahi_client_new" >&5 -printf "%s\n" "$ac_cv_lib_avahi_client_avahi_client_new" >&6; } -if test "x$ac_cv_lib_avahi_client_avahi_client_new" = xyes -then : - lib_for_avahi="-lavahi-common -lavahi-client" -else case e in #( - e) enable_avahi=false ;; -esac -fi - - -fi - for ac_header in avahi-client/publish.h -do : - ac_fn_c_check_header_compile "$LINENO" "avahi-client/publish.h" "ac_cv_header_avahi_client_publish_h" "$ac_includes_default" -if test "x$ac_cv_header_avahi_client_publish_h" = xyes -then : - printf "%s\n" "#define HAVE_AVAHI_CLIENT_PUBLISH_H 1" >>confdefs.h - -else case e in #( - e) enable_avahi=false ;; -esac -fi - -done - for ac_header in avahi-common/alternative.h -do : - ac_fn_c_check_header_compile "$LINENO" "avahi-common/alternative.h" "ac_cv_header_avahi_common_alternative_h" "$ac_includes_default" -if test "x$ac_cv_header_avahi_common_alternative_h" = xyes -then : - printf "%s\n" "#define HAVE_AVAHI_COMMON_ALTERNATIVE_H 1" >>confdefs.h - -else case e in #( - e) enable_avahi=false ;; -esac -fi - -done - - if test "$enable_avahi" = "true" - then - - - -printf "%s\n" "#define HAVE_AVAHI 1" >>confdefs.h - - enable_discovery=true - fi - - if test "$do_discovery" != "check" -a "$enable_discovery" != "true" - then - as_fn_error $? "cannot enable service discovery - no supported mechanisms" "$LINENO" 5 - fi - if test "$enable_discovery" = "true" - then - -printf "%s\n" "#define HAVE_SERVICE_DISCOVERY 1" >>confdefs.h - - fi - -fi - - - enable_systemd=false { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if systemd should be used" >&5 printf %s "checking if systemd should be used... " >&6; } @@ -7048,7 +6815,36 @@ fi if $enable_systemd then - for ac_header in systemd/sd-daemon.h + ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi + for ac_header in systemd/sd-daemon.h do : ac_fn_c_check_header_compile "$LINENO" "systemd/sd-daemon.h" "ac_cv_header_systemd_sd_daemon_h" "$ac_includes_default" if test "x$ac_cv_header_systemd_sd_daemon_h" = xyes diff --git a/configure.ac b/configure.ac index 72528d1d75b..5b13f0c2e1d 100644 --- a/configure.ac +++ b/configure.ac @@ -86,11 +86,6 @@ AC_ARG_WITH([group], [pcp_group=pcp]) AC_SUBST(pcp_group) -AC_ARG_WITH([discovery], - [AS_HELP_STRING([--with-discovery],[enable support for service discovery (default is on)])], - [do_discovery=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-discovery=$withval"], - [do_discovery=check]) - AC_ARG_WITH([systemd], [AS_HELP_STRING([--with-systemd],[enable support for systemd services (default is on)])], [do_systemd=$withval; PACKAGE_CONFIGURE="$PACKAGE_CONFIGURE --with-systemd=$withval"], @@ -832,40 +827,6 @@ if test "x$use_sanitizer" != "xno"; then fi AC_SUBST(sanitizer) -dnl Check for service discovery mechanisms (DNS-SD, Avahi) -AS_IF([test "x$do_discovery" != "xno"], [ - # on macOS, dns_sd.h - - # on Linux, aloha Avahi - enable_avahi=true - PKG_CHECK_MODULES([avahi], [avahi-client], - [AC_CHECK_LIB(avahi-client, avahi_client_new, - [lib_for_avahi="-lavahi-common -lavahi-client"], - [enable_avahi=false]) - ],[enable_avahi=false]) - AC_CHECK_HEADERS([avahi-client/publish.h],, [enable_avahi=false]) - AC_CHECK_HEADERS([avahi-common/alternative.h],, [enable_avahi=false]) - - if test "$enable_avahi" = "true" - then - AC_SUBST(lib_for_avahi) - AC_SUBST(avahi_CFLAGS) - AC_DEFINE(HAVE_AVAHI, [1], [Service discovery via Avahi]) - enable_discovery=true - fi - - if test "$do_discovery" != "check" -a "$enable_discovery" != "true" - then - AC_MSG_ERROR([cannot enable service discovery - no supported mechanisms]) - fi - if test "$enable_discovery" = "true" - then - AC_DEFINE(HAVE_SERVICE_DISCOVERY, [1], [Service discovery mechanisms]) - fi -]) -AC_SUBST(enable_discovery) -AC_SUBST(enable_avahi) - dnl Check for systemd services enable_systemd=false AC_MSG_CHECKING([if systemd should be used]) diff --git a/debian/control.pcp b/debian/control.pcp index a056c014da5..c65e5636c6c 100644 --- a/debian/control.pcp +++ b/debian/control.pcp @@ -10,17 +10,14 @@ Build-Depends: bison, flex, gawk, procps, pkg-config, debhelper (>= 11), libreadline-dev | libreadline5-dev | libreadline-gplv2-dev, chrpath, libbsd-dev [kfreebsd-any], libkvm-dev [kfreebsd-any], ?{python-all}, ?{python-dev}, python3-setuptools, - libsasl2-dev, - ?{libuv1-dev}, ?{libssl-dev}, libavahi-common-dev, - ?{qt-dev}, + libsasl2-dev, ?{libuv1-dev}, ?{libssl-dev}, ?{qt-dev}, autotools-dev, zlib1g-dev, autoconf, ?{libclass-dbi-perl}, ?{libdbd-mysql-perl}, ?{python-psycopg2}, ?{python-openpyxl}, ?{dh-python}, ?{libpfm4-dev}, libncurses-dev, ?{python-requests}, ?{libextutils-autoinstall-perl}, ?{libxml-tokeparser-perl}, ?{libjson-perl}, ?{libwww-perl}, ?{libnet-snmp-perl}, ?{liblzma-dev}, ?{systemd-pkgconfig}, - ?{libsystemd-dev}, ?{clang}, - ?{bpftrace}, + ?{libsystemd-dev}, ?{clang}, ?{bpftrace}, ?{llvm}, ?{libibumad-dev}, ?{libibmad-dev}, ?{libibverbs-dev}, ?{libinih-dev}, ?{postfix}, ?{libxml-libxml-perl}, ?{libfile-slurp-perl}, ?{libyaml-libyaml-perl}, diff --git a/docs/HowTos/nix/index.rst b/docs/HowTos/nix/index.rst index 45f76d6dc68..a6d3604a4ca 100644 --- a/docs/HowTos/nix/index.rst +++ b/docs/HowTos/nix/index.rst @@ -345,7 +345,6 @@ The following features are enabled by default: - **Core PCP tools and libraries**: pminfo, pmstat, pmrep, pmcd, etc. - **Python3 and Perl language bindings** - **Secure sockets**: SSL/TLS via OpenSSL -- **Service discovery**: via Avahi/mDNS - **Transparent archive decompression**: via xz/lzma - **Systemd integration**: unit files, tmpfiles, sysusers - **Performance events**: via libpfm4 diff --git a/lgtm.yml b/lgtm.yml index 3e0328a4f87..9855fdafd53 100644 --- a/lgtm.yml +++ b/lgtm.yml @@ -9,7 +9,6 @@ extraction: - auditd - autoconf - autotools-dev - - avahi-utils - bc - bind9-host - bison @@ -33,7 +32,6 @@ extraction: - gfs2-utils - git - iproute2 - - libavahi-common-dev - libclass-dbi-perl - libcoin-dev - libdbd-mysql-perl diff --git a/man/man1/pmcd.1 b/man/man1/pmcd.1 index 7db6eb5402b..f7cebe0f238 100644 --- a/man/man1/pmcd.1 +++ b/man/man1/pmcd.1 @@ -97,8 +97,8 @@ The available command line options are: Disable service advertisement. By default, .B pmcd -will advertise its presence on the network using any available mechanisms -(such as Avahi/DNS-SD), assisting remote monitoring tools with finding it. +will advertise its presence on the network using any available +mechanisms, assisting remote monitoring tools with finding it. These mechanisms are disabled with this option. .TP \f3\-c\f1 \f2config\f1, \f3\-\-config\f1=\f2config\f1 @@ -1465,7 +1465,7 @@ and .BR PMNS (5). .\" control lines for scripts/man-spell -.\" +ok+ Avahi PMCD_CREDS_TIMEOUT PMCD_MAXPENDING +.\" +ok+ PMCD_CREDS_TIMEOUT PMCD_MAXPENDING .\" +ok+ SASL SD addr_family appl boing .\" +ok+ OpenRequestSocket .\" +ok+ PMCD_LOCAL PMCD_PATH diff --git a/man/man1/pmfind.1 b/man/man1/pmfind.1 index b05352ef47d..6fb0d89c790 100644 --- a/man/man1/pmfind.1 +++ b/man/man1/pmfind.1 @@ -115,20 +115,6 @@ Display usage message and exit. .SH MECHANISMS Supported mechanisms for service discovery are: .TP -.B avahi -Searches for services which are broadcasting using mDNS via -.BR avahi-daemon (8). -An optional suffix \fB",timeout=N"\fP may be added to limit the amount of -time waiting for the avahi-daemon. -.B N -is a floating point number specifying the number of seconds to wait. -The default is 0.5 seconds. -This timeout may also be specified by setting the environment variable -.B AVAHI_DISCOVERY_TIMEOUT -to the desired number of seconds. -If both are specified, then the value specified in the environment variable -takes precedence. -.TP .B probe=/ Actively probes the given subnet for the requested PCP service(s). .B @@ -222,4 +208,4 @@ and .BR pcp.env (5). .\" control lines for scripts/man-spell -.\" +ok+ CMD DIR FD_SETSIZE Inet avahi mDNS maxThreads +.\" +ok+ CMD DIR FD_SETSIZE Inet maxThreads diff --git a/man/man1/pmproxy.1 b/man/man1/pmproxy.1 index 8381a3022b6..6fa0ba94c13 100644 --- a/man/man1/pmproxy.1 +++ b/man/man1/pmproxy.1 @@ -105,8 +105,8 @@ The available command line options are: Disable service advertisement. By default, .B pmproxy -will advertise its presence on the network using any available mechanisms -(such as Avahi/DNS-SD), assisting remote monitoring tools with finding it. +will advertise its presence on the network using any available +mechanisms, assisting remote monitoring tools with finding it. These mechanisms are disabled with this option. .TP \f3\-c\f1 \f2conffile\f1, \f3\-\-config\f1=\f2conffile\f1 @@ -595,7 +595,7 @@ and .BR pcp.env (5). .\" control lines for scripts/man-spell -.\" +ok+ Avahi OpenRequestSocket OpenSSL +.\" +ok+ OpenRequestSocket OpenSSL .\" +ok+ PMPROXY PMPROXY_VARIABLE .\" +ok+ SD {from DNS-SD} TIME_WAIT .\" +ok+ openssl pki valkey diff --git a/man/man3/pmdiscoverservices.3 b/man/man3/pmdiscoverservices.3 index 8b6b5a965f5..7786d37977a 100644 --- a/man/man3/pmdiscoverservices.3 +++ b/man/man3/pmdiscoverservices.3 @@ -98,18 +98,6 @@ specifies the style of discovery to be used. .PP The currently supported mechanisms are: .TP -.B avahi -This searches for services which are broadcasting using mDNS via -.BR avahi-daemon (8). -An optional suffix \fB",timeout=N"\fP may be added -to specify the discovery timeout in floating-point multiples of one -second. -The default timeout is 0.5 seconds, which may be overridden -by the \fBAVAHI_DISCOVERY_TIMEOUT\fP environment variable, also -specified in floating-point multiples of one second. -If both are specified, then -the value specified in the environment variable takes precedence. -.TP .B probe=/ Actively probes the given subnet for the requested PCP service(s). is an inet or ipv6 @@ -254,9 +242,8 @@ The specified \fImechanism\fP is not supported. .BR PMAPI (3), .BR pmGetConfig (3), .BR pcp.conf (5), -.BR pcp.env (5) and -.BR avahi-daemon (8). +.BR pcp.env (5). .\" control lines for scripts/man-spell -.\" +ok+ maxThreads avahi mDNS inet DIR CMD __FD_SETSIZE +.\" +ok+ maxThreads inet DIR CMD __FD_SETSIZE diff --git a/qa/283 b/qa/283 index 494424104a7..fec21adb83a 100755 --- a/qa/283 +++ b/qa/283 @@ -33,20 +33,6 @@ _cleanup() trap "_cleanup; exit \$status" 0 1 2 3 15 -# Test is failing on test-centos6-container in CI deep inside -# the avahi code (not the PCP code), so we've decided to -# _notrun on anything related to RHEL 6. -# -case `admin/whatami` -in - *CentOS6.*) - _notrun "dodge avahi issue on CentOS 6" - ;; - *RHEL*6.*) - _notrun "dodge avahi issue on RHEL 6" - ;; -esac - _filter() { sed -n \ diff --git a/qa/724 b/qa/724 index bbf7ba819ef..f2e3b2de29d 100755 --- a/qa/724 +++ b/qa/724 @@ -5,36 +5,14 @@ # Copyright (c) 2014 Red Hat. All Rights Reserved. # -seq=`basename $0` -echo "QA output created by $seq" +# test really-retired by nathans on 19 Mar 2026 +# +# to see the original test +# $ git diff 05a2c67246 -- 724 -# get standard environment, filters and checks +seq=`basename $0` . ./common.product . ./common.filter . ./common.check -_get_libpcp_config -$service_discovery || _notrun "No support for service discovery" - -# Make sure that at least one of the supported discovery mechanisms is available. -discovery_available=false -avahi-daemon --check 2>/dev/null && discovery_available=true -$discovery_available || _notrun "No discovery mechanisms are available" - -status=1 # failure is the default! -trap "cd $here; rm -rf $tmp.*; exit \$status" 0 1 2 3 15 - -# real QA test starts here - -echo "Unknown service" -pmfind -s unknown -echo "Exit status: $?" - -echo "Unknown mechanism" -pmfind -m unknown -echo "Exit status: $?" - -# success, all done -status=0 - -exit +_notrun 'retired and culled' diff --git a/qa/724.out b/qa/724.out index 62fe9bcf453..9acf427b864 100644 --- a/qa/724.out +++ b/qa/724.out @@ -1,8 +1,5 @@ QA output created by 724 -Unknown service -No unknown servers discovered -Exit status: 1 -Unknown mechanism -pmfind: service pmcd discovery failure: Operation not supported -pmfind: service pmproxy discovery failure: Operation not supported -Exit status: 2 +test really-retired by nathans on 19 Mar 2026 + +to see the original output + $ git diff 05a2c67246 -- 724.out diff --git a/qa/775 b/qa/775 index a61526be23b..efe9aa33d2d 100755 --- a/qa/775 +++ b/qa/775 @@ -6,66 +6,14 @@ # Copyright (c) 2014 Red Hat. All Rights Reserved. # -seq=`basename $0` -echo "QA output created by $seq" - -# get standard environment, filters and checks -. ./common.discovery -_check_service_discovery - -# no pmcd servers found on vm14 (CentOS6.10) and no -# good reason that is apparently related to PCP can -# be found, so _notrun on anything related to RHEL 6. +# test really-retired by nathans on 19 Mar 2026 # -case `admin/whatami` -in - *CentOS6.*) - _notrun "dodge avahi issue on CentOS 6" - ;; - *RHEL*6.*) - _notrun "dodge avahi issue on RHEL 6" - ;; -esac - -status=1 # failure is the default! -service=pmcd -trap "_cleanup_avahi_service; exit \$status" 0 1 2 3 15 - -# real QA test starts here -_control_avahi_service - -echo "No arguments" | tee -a $seq_full -pmfind | _filter_discovery_unresolved -echo "Exit status: $?" - -echo "-s pmcd -r" | tee -a $seq_full -pmfind -s pmcd -r | _filter_discovery_resolved -echo "Exit status: $?" +# to see the original test +# $ git diff 05a2c67246 -- 775 -echo "-m all" | tee -a $seq_full -pmfind -m all | _filter_discovery_unresolved -echo "Exit status: $?" - -echo "-s pmcd -m all --resolve" | tee -a $seq_full -pmfind -s pmcd -m all --resolve | _filter_discovery_resolved -echo "Exit status: $?" - -echo "-q" | tee -a $seq_full -pmfind -q -echo "Exit status: $?" - -echo "-q -s pmcd" | tee -a $seq_full -pmfind -q -s pmcd -echo "Exit status: $?" - -echo "-q -m all" | tee -a $seq_full -pmfind -q -m all -echo "Exit status: $?" - -echo "-q -s pmcd -m all" | tee -a $seq_full -pmfind -q -s pmcd -m all -echo "Exit status: $?" +seq=`basename $0` +. ./common.product +. ./common.filter +. ./common.check -# success, all done -status=0 -exit +_notrun 'retired and culled' diff --git a/qa/775.out b/qa/775.out index c6a5e69f243..cceb4b0e58b 100644 --- a/qa/775.out +++ b/qa/775.out @@ -1,23 +1,5 @@ QA output created by 775 -No arguments -Discovered pmcd servers: -Sought pmproxy servers -Exit status: 0 --s pmcd -r -Discovered pmcd servers: -Exit status: 0 --m all -Discovered pmcd servers: -Sought pmproxy servers -Exit status: 0 --s pmcd -m all --resolve -Discovered pmcd servers: -Exit status: 0 --q -Exit status: 0 --q -s pmcd -Exit status: 0 --q -m all -Exit status: 0 --q -s pmcd -m all -Exit status: 0 +test really-retired by nathans on 19 Mar 2026 + +to see the original output + $ git diff 05a2c67246 -- 775.out diff --git a/qa/840 b/qa/840 index a590b07f1af..8643d9f1a16 100755 --- a/qa/840 +++ b/qa/840 @@ -5,19 +5,14 @@ # Copyright (c) 2013-2014 Red Hat. All Rights Reserved. # -seq=`basename $0` -echo "QA output created by $seq" - -. ./common.discovery -_check_avahi_service - -status=1 # failure is the default! -service=pmcd -trap "_cleanup_avahi_service; exit \$status" 0 1 2 3 15 +# test really-retired by nathans on 19 Mar 2026 +# +# to see the original test +# $ git diff 05a2c67246 -- 840 -# real QA test starts here -_control_avahi_service -_verify_avahi_service +seq=`basename $0` +. ./common.product +. ./common.filter +. ./common.check -status=0 -exit +_notrun 'retired and culled' diff --git a/qa/840.out b/qa/840.out index 8b1ab6d8a88..f2f3d6d5c2f 100644 --- a/qa/840.out +++ b/qa/840.out @@ -1,3 +1,5 @@ QA output created by 840 -Verify pmcd avahi service advertising -. PCP pmcd on HOSTNAME _pmcd._tcp local +test really-retired by nathans on 19 Mar 2026 + +to see the original output + $ git diff 05a2c67246 -- 840.out diff --git a/qa/946 b/qa/946 index 4a078ad17c9..8b09fde1032 100755 --- a/qa/946 +++ b/qa/946 @@ -6,64 +6,14 @@ # Copyright (c) 2014 Red Hat. All Rights Reserved. # -seq=`basename $0` -echo "QA output created by $seq" - -. ./common.discovery -_check_avahi_service - -# no pmcd servers found on vm14 (CentOS6.10) and no -# good reason that is apparently related to PCP can -# be found. +# test really-retired by nathans on 19 Mar 2026 # -case `admin/whatami` -in - *CentOS6.*) - _notrun "dodge avahi issue on CentOS 6" - ;; -esac - -status=1 # failure is the default! -service=pmcd -trap "_cleanup_avahi_service; exit \$status" 0 1 2 3 15 - -# real QA test starts here -_control_avahi_service - -echo "-m avahi" | tee -a $seq_full -pmfind -m avahi | tee -a $seq_full | _filter_discovery_unresolved -echo "Exit status: $?" - -echo "-s pmcd -m avahi -r" | tee -a $seq_full -pmfind -s pmcd -m avahi -r | tee -a $seq_full | _filter_discovery_resolved -echo "Exit status: $?" +# to see the original test +# $ git diff 05a2c67246 -- 946 -echo "-q -m avahi" -pmfind -q -m avahi -echo "Exit status: $?" - -echo "-q -s pmcd -m avahi" -pmfind -q -s pmcd -m avahi -echo "Exit status: $?" - -echo "-q -s pmcd -m avahi,timeout=5.0" -pmfind -q -s pmcd -m avahi,timeout=5.0 -# up to 5 seconds may elapse here -echo "Exit status: $?" - -echo "-q -s pmcd -m avahi with AVAHI_DISCOVERY_TIMEOUT=5" -AVAHI_DISCOVERY_TIMEOUT=5 pmfind -q -s pmcd -m avahi -# up to 5 seconds may elapse here -echo "Exit status: $?" - -echo "-m all" | tee -a $seq_full -pmfind -m all | tee -a $seq_full | _filter_discovery_unresolved -echo "Exit status: $?" - -echo "-m all --resolve" | tee -a $seq_full -pmfind -m all --resolve | tee -a $seq_full | _filter_discovery_resolved -echo "Exit status: $?" +seq=`basename $0` +. ./common.product +. ./common.filter +. ./common.check -# success, all done -status=0 -exit +_notrun 'retired and culled' diff --git a/qa/946.out b/qa/946.out index 580bf4f2312..156bf8f6e79 100644 --- a/qa/946.out +++ b/qa/946.out @@ -1,24 +1,5 @@ QA output created by 946 --m avahi -Discovered pmcd servers: -Sought pmproxy servers -Exit status: 0 --s pmcd -m avahi -r -Discovered pmcd servers: -Exit status: 0 --q -m avahi -Exit status: 0 --q -s pmcd -m avahi -Exit status: 0 --q -s pmcd -m avahi,timeout=5.0 -Exit status: 0 --q -s pmcd -m avahi with AVAHI_DISCOVERY_TIMEOUT=5 -Exit status: 0 --m all -Discovered pmcd servers: -Sought pmproxy servers -Exit status: 0 --m all --resolve -Discovered pmcd servers: -Sought pmproxy servers -Exit status: 0 +test really-retired by nathans on 19 Mar 2026 + +to see the original output + $ git diff 05a2c67246 -- 946.out diff --git a/qa/950 b/qa/950 index ec788febf1c..57f509da918 100755 --- a/qa/950 +++ b/qa/950 @@ -5,29 +5,14 @@ # Copyright (c) 2014 Red Hat. # -seq=`basename $0` -echo "QA output created by $seq" - -. ./common.discovery -_check_avahi_service - -status=1 # failure is the default! -service=pmproxy -trap "_cleanup_avahi_service; exit \$status" 0 1 2 3 15 - -_filter() -{ - sed \ - -e "/Failed to resolve service '.*' of type '_pmproxy._tcp' in domain 'local': Timeout reached/d" \ - # done -} - -# real QA test starts here -_control_avahi_service -_wait_for_pmproxy || _exit 1 -sleep 5 +# test really-retired by nathans on 19 Mar 2026 +# +# to see the original test +# $ git diff 05a2c67246 -- 950 -_verify_avahi_service 2>&1 | _filter +seq=`basename $0` +. ./common.product +. ./common.filter +. ./common.check -status=0 -exit +_notrun 'retired and culled' diff --git a/qa/950.out b/qa/950.out index 9f423d77cb5..e1142fb4a83 100644 --- a/qa/950.out +++ b/qa/950.out @@ -1,3 +1,5 @@ QA output created by 950 -Verify pmproxy avahi service advertising -. PCP pmproxy on HOSTNAME _pmproxy._tcp local +test really-retired by nathans on 19 Mar 2026 + +to see the original output + $ git diff 05a2c67246 -- 950.out diff --git a/qa/README b/qa/README index c53f14e292a..978fb4dfc91 100644 --- a/qa/README +++ b/qa/README @@ -99,10 +99,6 @@ Basic getting started for pmdatrace, pmlogger connections via pmlc, and some QA tests. Opening the TCP range 4320 to 4350 (inclusive) should suffice. - If the avahi services are to be tested, then the firewall also needs - to allow mDNS traffic (UDP, port 5353), for both external and internal - connections. - Doing the Real Work ------------------- diff --git a/qa/admin/other-packages/manifest b/qa/admin/other-packages/manifest index a0508d6f4ff..01e93de9874 100644 --- a/qa/admin/other-packages/manifest +++ b/qa/admin/other-packages/manifest @@ -380,17 +380,6 @@ S_pkg? verbs.h [N/A (build optional)] slackpkg? verbs.h [N/A (build optional)] pacman? /usr/include/infiniband/verbs.h [rdma-core (build optional)] brew? verbs.h [N/A (build optional)] -# -- avahi API -dpkg? /usr/include/avahi-common/defs.h [libavahi-common-dev (build optional)] -rpm? /usr/include/avahi-common/defs.h [avahi-devel or libavahi-devel (build optional)] -emerge? /usr/include/avahi-common/defs.h [net-dns/avahi (build optional)] -pkgin? /usr/pkg/include/avahi-common/defs.h [avahi (build optional)] -pkg_add? /usr/local/include/avahi-common/defs.h [avahi or avahi-libs (build optional)] -F_pkg? /usr/local/include/avahi-common/defs.h [avahi or avahi-app (build optional)] -S_pkg? /usr/include/avahi-common/defs.h [system/network/avahi (build optional)] -slackpkg? avahi-common/defs.h [N/A (build optional)] -pacman? /usr/include/avahi-common/defs.h [extra/avahi (build optional)] -brew? avahi-common/defs.h [N/A (build optional)] # -- libpfm dpkg? /usr/include/perfmon/pfmlib_perf_event.h [libpfm4-dev (build optional)] rpm? /usr/include/perfmon/pfmlib_perf_event.h [libpfm-devel (build optional)] @@ -873,17 +862,6 @@ S_pkg? valgrind [developer/debug/valgrind (QA optional)] slackpkg? valgrind [valgrind (QA optional)] pacman? valgrind [extra/valgrind (QA optional)] brew? valgrind [N/A (QA optional)] # valgrind is "available" for macOS, just fails to install on Mohave as of 30 Nov 2018 -# -- avahi-browse(1) -dpkg? avahi-browse [avahi-tools or avahi-utils (QA optional)] -rpm? avahi-browse [avahi-tools or avahi-utils (QA optional)] -emerge? avahi-browse [net-dns/avahi (QA optional)] -pkgin? avahi-browse [avahi or avahi-tools or avahi-utils (QA optional)] -pkg_add? avahi-browse [avahi or avahi-tools or avahi-utils (QA optional)] -F_pkg? avahi-browse [avahi or avahi-app (QA optional)] -S_pkg? avahi-browse [system/network/avahi (QA optional)] -slackpkg? avahi-browse [N/A (QA optional)] -pacman? avahi-browse [extra/avahi (QA optional)] -brew? avahi-browse [N/A (QA optional)] # -- ifconfig(1) dpkg? ifconfig [net-tools] rpm? ifconfig [net-tools or net-tools-deprecated] diff --git a/qa/admin/other-packages/skip b/qa/admin/other-packages/skip index 7ed8405e603..82034a701e3 100644 --- a/qa/admin/other-packages/skip +++ b/qa/admin/other-packages/skip @@ -87,11 +87,6 @@ Fedora 3[0-9] - community-mysql Fedora 3[0-9] - python-{.*} python2-{.*} # these ones are SuSE packages, not in the RH ecosystem Fedora - - kubectl libqt4-devel -#-- Gentoo -# observed on vm05 -# I cannot figure out how to remake this package with USE=utils so that -# avahi-browse is built and installed (Ken) -Gentoo 2\.4\.2 - net-dns/avahi #-- LinuxMint # observed on vm18 # libsoqt-dev -> libsoqt4-dev and all the other Qt pieces are Qt5 diff --git a/qa/admin/other-packages/skip.debian8 b/qa/admin/other-packages/skip.debian8 index 035bc406f01..f0a653613c5 100644 --- a/qa/admin/other-packages/skip.debian8 +++ b/qa/admin/other-packages/skip.debian8 @@ -1,5 +1,4 @@ # for vagrant, these are the packages we don't want to install -avahi-tools cpan(Text::CSV_XS) docker.io libspreadsheet-readsxc-perl diff --git a/qa/admin/other-packages/skip.ubuntu1604 b/qa/admin/other-packages/skip.ubuntu1604 index 745df60cda5..3addae9b76b 100644 --- a/qa/admin/other-packages/skip.ubuntu1604 +++ b/qa/admin/other-packages/skip.ubuntu1604 @@ -1,6 +1,5 @@ # for vagrant, these are the packages we don't want to install apache2-mpm-worker -avahi-tools bsd-mailx cpan(Text::CSV_XS) libcoin-dev diff --git a/qa/admin/other-packages/skip.ubuntu1804 b/qa/admin/other-packages/skip.ubuntu1804 index 442cbde91ea..1671765c9a0 100644 --- a/qa/admin/other-packages/skip.ubuntu1804 +++ b/qa/admin/other-packages/skip.ubuntu1804 @@ -1,6 +1,5 @@ # for vagrant, these are the packages we don't want to install apache2-mpm-worker -avahi-tools bsd-mailx cpan(Text::CSV_XS) libcoin-dev diff --git a/qa/admin/other-packages/unavailable b/qa/admin/other-packages/unavailable index 7432ec75c37..6e4221dc5f1 100644 --- a/qa/admin/other-packages/unavailable +++ b/qa/admin/other-packages/unavailable @@ -17,13 +17,13 @@ #-- ArchLinux ArchLinux - - qtchooser #-- CentOS -CentOS 8\.2\. - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse -CentOS 8\.[0-1] - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse -CentOS 7\.8 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python36-devel python36-libs python36-setuptools python3-curses python3-elasticsearch python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse +CentOS 8\.2\. - 389-ds 389-ds-base apache2 chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse +CentOS 8\.[0-1] - 389-ds 389-ds-base apache2 chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse +CentOS 7\.8 - apache2 bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python36-devel python36-libs python36-setuptools python3-curses python3-elasticsearch python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse CentOS 7\.7 - bpftrace chan-devel coreutils-single HdrHistogram_c-devel libvirt-python3 perl-Getopt-Std perl-Spreadsheet-Read python2-openpyxl python3-elasticsearch python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qtchooser realpath redis-server system-python-libs zfs-fuse -CentOS 7\.6 - apache2 avahi-utils bpftrace chan-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python2-openpyxl python36-devel python36-libs python36-setuptools python3-curses python3-elasticsearch python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser realpath RediSearch redis-server sensors sqlite-libs system-python-libs zabbix22-agent zabbix-agent zfs-fuse +CentOS 7\.6 - apache2 bpftrace chan-devel Coin-devel community-mysql coreutils-single docker-io git-core HdrHistogram_c-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools python2-openpyxl python36-devel python36-libs python36-setuptools python3-curses python3-elasticsearch python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-pylint python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser realpath RediSearch redis-server sensors sqlite-libs system-python-libs zabbix22-agent zabbix-agent zfs-fuse CentOS 7\.5 - bpftrace chan-devel coreutils-single HdrHistogram_c-devel libvirt-python3 perl-Getopt-Std perl-Spreadsheet-Read python2-openpyxl python3-elasticsearch python3-libvirt python3-libvirt-python python3-lxml python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-pyodbc python3-requests python3-rtslib python3-rtslib-fb python3-six python-openpyxl python-prometheus_client python-pylint qtchooser realpath redis-server system-python-libs zfs-fuse -CentOS 6\.10 - 389-ds apache2 avahi-utils bpftrace ccache chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single cppcheck docker docker-common docker-io git-core HdrHistogram_c-devel kubernetes-client kubernetes-node libavahi-devel libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libuv-devel libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-Net-SNMP perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-WriteExcel perl-Spreadsheet-XLSX perl-Text-CSV_XS perl-YAML-LibYAML pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-requests python2-rtslib python2-rtslib-fb python2-setuptools python2-six python-curses python-elasticsearch python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qt5-qtbase-devel qt5-qtsvg-devel qtchooser ragel rdma-core-devel realpath redis RediSearch selinux-policy-devel sensors socat SoQt-devel sqlite-libs statsd systemd-devel system-python-libs uic zabbix22-agent zabbix-agent zfs-fuse +CentOS 6\.10 - 389-ds apache2 bpftrace ccache chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single cppcheck docker docker-common docker-io git-core HdrHistogram_c-devel kubernetes-client kubernetes-node libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libuv-devel libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-Net-SNMP perl-rrdtool perl-Spreadsheet-Read perl-Spreadsheet-WriteExcel perl-Spreadsheet-XLSX perl-Text-CSV_XS perl-YAML-LibYAML pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-requests python2-rtslib python2-rtslib-fb python2-setuptools python2-six python-curses python-elasticsearch python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qt5-qtbase-devel qt5-qtsvg-devel qtchooser ragel rdma-core-devel realpath redis RediSearch selinux-policy-devel sensors socat SoQt-devel sqlite-libs statsd systemd-devel system-python-libs uic zabbix22-agent zabbix-agent zfs-fuse #-- Debian # Version Code Name # 6 squeeze @@ -33,16 +33,16 @@ CentOS 6\.10 - 389-ds apache2 avahi-utils bpftrace ccache chan-de # 10 buster # 11 bullseye # ? sid (unstable) -Debian 11\..* - apache2-mpm-worker avahi-tools libicu libreadline6-dev libsoqt-dev libsoqt-dev-common libuv-dev mariadb-client-core mysql-client-core mysql-client-core-[0-9][0-9.]* perl-modules qt4-qmake redis-cli zfsutils-linux -Debian 10\..* - apache2-mpm-worker avahi-tools kubernetes-client libreadline6-dev libsoqt5-dev libsoqt-dev libsoqt-dev-common libuv-dev mariadb-client-core mysql-client-core mysql-client-core-[0-9][0-9.]* perl-modules realpath redis-cli zfsutils-linux +Debian 11\..* - apache2-mpm-worker libicu libreadline6-dev libsoqt-dev libsoqt-dev-common libuv-dev mariadb-client-core mysql-client-core mysql-client-core-[0-9][0-9.]* perl-modules qt4-qmake redis-cli zfsutils-linux +Debian 10\..* - apache2-mpm-worker kubernetes-client libreadline6-dev libsoqt5-dev libsoqt-dev libsoqt-dev-common libuv-dev mariadb-client-core mysql-client-core mysql-client-core-[0-9][0-9.]* perl-modules realpath redis-cli zfsutils-linux Debian 10\..* i.86 bpftrace Debian 9\..* - bpftrace docker.io kubernetes-client libsoqt5-dev libuv-dev redis-cli -Debian 8\.[11] - avahi-tools cpan(Text::CSV_XS) docker.io kubernetes-client libcoin-dev libsoqt5-dev libspreadsheet-readsxc-perl libuv1-dev mariadb-client-core mysql-client-core python3-openpyxl python3-prometheus-client python-prometheus-client zfsutils-linux +Debian 8\.[11] - cpan(Text::CSV_XS) docker.io kubernetes-client libcoin-dev libsoqt5-dev libspreadsheet-readsxc-perl libuv1-dev mariadb-client-core mysql-client-core python3-openpyxl python3-prometheus-client python-prometheus-client zfsutils-linux #-- Fedora -Fedora 34 - 389-ds apache2 avahi-utils Coin[0-9]-devel Coin-devel docker docker-common docker-io infiniband-diags-devel libavahi-devel libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mysql net-tools-deprecated perl-DBD-mysql perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconfig platform-python-devel platform-python-setuptools python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-libvirt-python python3-Pillow python3-rtslib-fb realpath sensors system-python-libs zabbix22-agent -Fedora 33 - 389-ds Coin-devel apache2 avahi-utils docker-common docker-io libQt5Core-devel libavahi-devel libqt5-qtbase-devel libqt5-qtsvg-devel libqt5Core-devel libsqlite3 libvirt-python mariadb-client net-tools-deprecated perl-Spreadsheet-Read perl-ldap platform-python-devel platform-python-setuptools python3-Pillow python3-curses python3-libvirt-python python3-rtslib-fb python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six realpath sensors system-python-libs zabbix22-agent -Fedora 32 - 389-ds apache2 avahi-utils Coin[0-9]-devel Coin-devel docker docker-common docker-io libavahi-devel libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconfig platform-python-devel platform-python-setuptools python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-libvirt-python python3-Pillow python3-rtslib-fb realpath sensors system-python-libs zabbix22-agent -Fedora 31 - 389-ds apache2 avahi-utils Coin[0-9]-devel Coin-devel docker docker-common docker-io libavahi-devel libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconfig platform-python-devel platform-python-setuptools python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-libvirt-python python3-Pillow python3-rtslib-fb realpath RediSearch sensors system-python-libs zabbix22-agent +Fedora 34 - 389-ds apache2 Coin[0-9]-devel Coin-devel docker docker-common docker-io infiniband-diags-devel libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mysql net-tools-deprecated perl-DBD-mysql perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconfig platform-python-devel platform-python-setuptools python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-libvirt-python python3-Pillow python3-rtslib-fb realpath sensors system-python-libs zabbix22-agent +Fedora 33 - 389-ds Coin-devel apache2 docker-common docker-io libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libqt5Core-devel libsqlite3 libvirt-python mariadb-client net-tools-deprecated perl-Spreadsheet-Read perl-ldap platform-python-devel platform-python-setuptools python3-Pillow python3-curses python3-libvirt-python python3-rtslib-fb python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six realpath sensors system-python-libs zabbix22-agent +Fedora 32 - 389-ds apache2 Coin[0-9]-devel Coin-devel docker docker-common docker-io libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconfig platform-python-devel platform-python-setuptools python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-libvirt-python python3-Pillow python3-rtslib-fb realpath sensors system-python-libs zabbix22-agent +Fedora 31 - 389-ds apache2 Coin[0-9]-devel Coin-devel docker docker-common docker-io libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconfig platform-python-devel platform-python-setuptools python36-devel python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-libvirt-python python3-Pillow python3-rtslib-fb realpath RediSearch sensors system-python-libs zabbix22-agent #-- FreeBSD FreeBSD 10\.4 - py36-pillow FreeBSD 11\.[1-3] - libibmad libibumad py36-pillow zabbix34-agent @@ -54,14 +54,14 @@ Gentoo - - LinuxMint 17\.3 - kubernetes-client libsoqt5-dev libspreadsheet-readsxc-perl libuv1-dev libvirt-daemon libvirt-daemon-system python3-elasticsearch python3-libvirt python3-openpyxl python3-prometheus-client zfsutils-linux LinuxMint 18\.3 - kubernetes-client libsoqt5-dev #-- NetBSD -NetBSD 6\.1\.5 - QtSvg avahi avahi-tools avahi-utils docker json_reformat libibmad libibumad mkfs.gfs2 mysql-client nmap p5-DBD-mysql py36-imaging py36-libvirt py36-prometheus-client qt5 qtchooser realpath sysstat uic valgrind zabbix-agent -NetBSD 8\.0 - QtSvg avahi-tools avahi-utils json_reformat libibmad libibumad mkfs.gfs2 py36-imaging py36-libvirt py36-prometheus-client qtchooser realpath sysstat uic valgrind zabbix-agent +NetBSD 6\.1\.5 - QtSvg docker json_reformat libibmad libibumad mkfs.gfs2 mysql-client nmap p5-DBD-mysql py36-imaging py36-libvirt py36-prometheus-client qt5 qtchooser realpath sysstat uic valgrind zabbix-agent +NetBSD 8\.0 - QtSvg json_reformat libibmad libibumad mkfs.gfs2 py36-imaging py36-libvirt py36-prometheus-client qtchooser realpath sysstat uic valgrind zabbix-agent #-- OpenBSD -OpenBSD 6\.7 - libibumad libvirt-python3 py3-openpyxl py3-prometheus-client qtchooser realpath sed grep ed make flex mandoc bc avahi-tools avahi-utils +OpenBSD 6\.7 - libibumad libvirt-python3 py3-openpyxl py3-prometheus-client qtchooser realpath sed grep ed make flex mandoc bc OpenBSD 6\.4 - libibumad libvirt-python3 py3-openpyxl py3-prometheus-client qtchooser realpath -OpenBSD 6\.3 - avahi-tools avahi-utils libibumad libvirt-python3 py3-elasticsearch py3-openpyxl py3-prometheus-client qtchooser realpath +OpenBSD 6\.3 - libibumad libvirt-python3 py3-elasticsearch py3-openpyxl py3-prometheus-client qtchooser realpath #-- openSUSE -openSUSE 15\.[01] - 389-ds-base avahi-devel avahi-tools chan-devel community-mysql coreutils-single docker-common docker-io HdrHistogram_c-devel kubernetes-client kubernetes-node libvirt-python libvirt-python3 mysql perl-DBD-MySQL perl-Getopt-Std perl-LDAP perl-Spreadsheet-WriteExcel perl-XML-TokeParser podman-docker pylint python2-libs python2-libvirt python2-rtslib python36-devel python3-libvirt python3-pillow python3-rtslib python-libs python-pylint python-rtslib python-setuptools qt5-qtsvg-devel qtchooser selinux-policy selinux-policy-devel selinux-policy-targeted statsd zabbix22-agent zabbix-agent zfs-fuse +openSUSE 15\.[01] - 389-ds-base chan-devel community-mysql coreutils-single docker-common docker-io HdrHistogram_c-devel kubernetes-client kubernetes-node libvirt-python libvirt-python3 mysql perl-DBD-MySQL perl-Getopt-Std perl-LDAP perl-Spreadsheet-WriteExcel perl-XML-TokeParser podman-docker pylint python2-libs python2-libvirt python2-rtslib python36-devel python3-libvirt python3-pillow python3-rtslib python-libs python-pylint python-rtslib python-setuptools qt5-qtsvg-devel qtchooser selinux-policy selinux-policy-devel selinux-policy-targeted statsd zabbix22-agent zabbix-agent zfs-fuse openSUSE 15.0 - coreutils-single perl-Getopt-Std podman-docker python3-pyodbc openSUSE 42\.2 - Coin[0-9]-devel Coin-devel coreutils-single docker-io libvirt-python3 perl-Getopt-Std podman-docker pylint python2-pylint python3-elasticsearch python3-libvirt python3-libvirt-python python3-pillow python3-rtslib python3-rtslib-fb python-pylint qtchooser selinux-policy selinux-policy-devel selinux-policy-targeted SoQt-devel zabbix22-agent zabbix-agent openSUSE 42\.3 - coreutils-single docker-io libvirt-python3 perl-Getopt-Std podman-docker pylint python2-pylint python3-elasticsearch python3-libvirt python3-libvirt-python python3-pillow python3-rtslib python3-rtslib-fb qtchooser zabbix22-agent zabbix-agent @@ -72,16 +72,16 @@ SUSE 12-SP0 - 389-ds 389-ds-base Coin[0-9]-devel Coin-devel core SUSE 12-SP4 - 389-ds 389-ds-base chan-devel Coin[0-9]-devel Coin-devel coreutils-single cppcheck gfs2-utils HdrHistogram_c-devel kubernetes-client kubernetes-node libuv-devel libvirt-python3 perl-Getopt-Std python36-libs python36-six python3-elasticsearch python3-libs python3-libvirt python3-libvirt-python python3-openpyxl python3-pillow python3-Pillow python3-prometheus_client python3-psycopg2 python3-rtslib python3-rtslib-fb qt5-qtbase-devel qt5-qtsvg-devel qtchooser selinux-policy-targeted SoQt-devel statsd system-python-libs yajl zabbix22-agent zabbix-agent zfs-fuse #-- RedHat RHEL 10\. - Coin[0-9]-devel mandoc python3-elasticsearch python3-prometheus_client ragel -RHEL 8\.2 - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse -RHEL 8\.[0-1] - 389-ds 389-ds-base apache2 avahi-devel avahi-tools avahi-utils chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libibmad-devel mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse python2-pylint -RHEL 7\.9 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel libavahi-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse zabbix22-agent python2-openpyxl python2-elasticsearch python-pylint python-prometheus_client python-openpyxl avahi-devel avahi-tools device-mapper-devel infiniband-diags-devel python2-setuptools python2-libvirt python-libvirt-python python2-lxml python2-psycopg2 setools python-curses python2-libs python2-devel podman-docker coreutils-single python2-rtslib-fb python2-rtslib -RHEL 7\.8 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel kubernetes-client libavahi-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse +RHEL 8\.2 - 389-ds 389-ds-base apache2 chan-devel Coin[0-9]-devel Coin-devel community-mysql cpan(YAML::LibYAML) cppcheck device-mapper-devel docker docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libibmad-devel libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-python libvirt-python3 mariadb-client net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-List-MoreUtils perl-rrdtool perl-Spreadsheet-Read perl-YAML-LibYAML pkg-config pkgconfig python36-libs python36-lxml python36-pillow python36-requests python36-setuptools python36-six python3-curses python3-devel python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb qt4-devel qtchooser qt-devel realpath RediSearch sensors SoQt-devel system-python-libs zabbix22-agent zabbix-agent zfs-fuse +RHEL 8\.[0-1] - 389-ds 389-ds-base apache2 chan-devel Coin[0-9]-devel Coin-devel cpan(YAML::LibYAML) cppcheck device-mapper-devel docker-common docker-io HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libibmad-devel mandoc perl-File-Slurp perl-Getopt-Std perl-JSON perl-ldap perl-List-MoreUtils perl-Spreadsheet-Read perl-YAML-LibYAML pylint python36-devel python36-lxml python3-libvirt-python python3-openpyxl python3-Pillow python3-pyodbc python3-rtslib-fb python-prometheus_client qt4-devel qtchooser qt-devel sensors SoQt-devel statsd zabbix22-agent zabbix-agent zfs-fuse python2-pylint +RHEL 7\.9 - apache2 bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse zabbix22-agent python2-openpyxl python2-elasticsearch python-pylint python-prometheus_client python-openpyxl device-mapper-devel infiniband-diags-devel python2-setuptools python2-libvirt python-libvirt-python python2-lxml python2-psycopg2 setools python-curses python2-libs python2-devel podman-docker coreutils-single python2-rtslib-fb python2-rtslib +RHEL 7\.8 - apache2 bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql docker-io git-core HdrHistogram_c-devel kubernetes-client libibumad-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 mariadb-client mysql net-tools-deprecated perl-base perl-DBD-mysql perl-Getopt-Std perl-interpreter perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkgconf-pkg-config platform-python-devel platform-python-setuptools qt4-devel qtchooser realpath RediSearch sensors sqlite-libs system-python-libs zabbix-agent zfs-fuse RHEL 7\.[5-7] - chan-devel Coin[0-9]-devel Coin-devel cppcheck device-mapper-devel HdrHistogram_c-devel kubernetes-client openssl-devel perl-Getopt-Std perl-Spreadsheet-Read perl-YAML-LibYAML pylint python2-elasticsearch python2-openpyxl python2-prometheus_client python2-pylint python-elasticsearch python-openpyxl python-prometheus_client python-pylint qtchooser ruby SoQt-devel statsd system-python-libs zabbix22-agent zabbix-agent zfs-fuse -RHEL 6\.10 - apache2 avahi-utils bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single device-mapper-devel docker-common docker-io git-core HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libavahi-devel libicu-devel libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkg-configmandoc pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-rtslib python2-rtslib-fb python-curses python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser ragel rdma-core-devel realpath RediSearch selinux-policy-devel sensors setools sqlite-libs systemd-devel system-python-libs uic xfsprogs +RHEL 6\.10 - apache2 bpftrace chan-devel Coin[0-9]-devel Coin-devel community-mysql coreutils-single device-mapper-devel docker-common docker-io git-core HdrHistogram_c-devel infiniband-diags-devel kubernetes-client kubernetes-node libicu-devel libpfm-devel libqt5Core-devel libQt5Core-devel libqt5-qtbase-devel libqt5-qtsvg-devel libsqlite3 libvirt-daemon libvirt-daemon-driver-qemu mandoc mariadb mariadb-client net-tools-deprecated perl-autodie perl-base perl-DBD-mysql perl-Getopt-Std perl-ldap perl-rrdtool perl-Spreadsheet-Read pkg-config pkg-configmandoc pkgconf-pkg-config platform-python-devel platform-python-setuptools podman-docker pylint python2-devel python2-elasticsearch python2-libs python2-libvirt python2-lxml python2-openpyxl python2-psycopg2 python2-pylint python2-rtslib python2-rtslib-fb python-curses python-libvirt-python python-openpyxl python-prometheus_client python-pylint qt4-devel qtchooser ragel rdma-core-devel realpath RediSearch selinux-policy-devel sensors setools sqlite-libs systemd-devel system-python-libs uic xfsprogs #-- Ubuntu -Ubuntu 20\.04 - apache2-mpm-worker avahi-tools kubernetes-client libicu libpython-dev libqt4-dev libreadline6-dev libsoqt4-dev libsoqt-dev libsoqt-dev-common libuv-dev mariadb-client-core mysql-client-core perl-modules qt4-qmake realpath redis-cli +Ubuntu 20\.04 - apache2-mpm-worker kubernetes-client libicu libpython-dev libqt4-dev libreadline6-dev libsoqt4-dev libsoqt-dev libsoqt-dev-common libuv-dev mariadb-client-core mysql-client-core perl-modules qt4-qmake realpath redis-cli Ubuntu 19\.10 - kubernetes-client libreadline6-dev libsoqt5-dev libsoqt-dev-common redis-tools Ubuntu 19\.04 - kubernetes-client libreadline6-dev libsoqt5-dev libsoqt-dev libsoqt-dev-common libuv-dev -Ubuntu 18\.04 - apache2-mpm-worker avahi-tools bpftrace kubernetes-client libicu libncurses-dev libreadline6-dev libsoqt520-dev libsoqt5-dev libsoqt-dev libuv-dev mariadb-client-core mysql-client-core perl-modules realpath redis-cli -Ubuntu 16\.04 - apache2-mpm-worker avahi-tools bpftrace kubernetes-client libncurses-dev libsoqt520-dev libsoqt5-dev libspreadsheet-readsxc-perl libuv-dev libvirt-daemon libvirt-daemon-system mandoc mariadb-client-core mysql-client-core perl-modules redis-cli redis-redisearch +Ubuntu 18\.04 - apache2-mpm-worker bpftrace kubernetes-client libicu libncurses-dev libreadline6-dev libsoqt520-dev libsoqt5-dev libsoqt-dev libuv-dev mariadb-client-core mysql-client-core perl-modules realpath redis-cli +Ubuntu 16\.04 - apache2-mpm-worker bpftrace kubernetes-client libncurses-dev libsoqt520-dev libsoqt5-dev libspreadsheet-readsxc-perl libuv-dev libvirt-daemon libvirt-daemon-system mandoc mariadb-client-core mysql-client-core perl-modules redis-cli redis-redisearch Ubuntu 14\.04 - bpftrace kubernetes-client libsoqt5-dev libsoqt-dev libsoqt-dev-common libspreadsheet-readsxc-perl libuv1-dev python3-elasticsearch python3-libvirt python3-openpyxl python3-prometheus-client redis-cli zfsutils-linux diff --git a/qa/admin/package-lists/AmazonLinux+2023+aarch64 b/qa/admin/package-lists/AmazonLinux+2023+aarch64 index 96a19f65555..3bfb97d4768 100644 --- a/qa/admin/package-lists/AmazonLinux+2023+aarch64 +++ b/qa/admin/package-lists/AmazonLinux+2023+aarch64 @@ -6,8 +6,6 @@ Spreadsheet::Read cpan audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/AmazonLinux+2023+x86_64 b/qa/admin/package-lists/AmazonLinux+2023+x86_64 index 93e5182dba3..94649929248 100644 --- a/qa/admin/package-lists/AmazonLinux+2023+x86_64 +++ b/qa/admin/package-lists/AmazonLinux+2023+x86_64 @@ -6,8 +6,6 @@ Spreadsheet::Read cpan audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/ArchLinux++x86_64 b/qa/admin/package-lists/ArchLinux++x86_64 index bd9c4a4ba7f..a350e0976d9 100644 --- a/qa/admin/package-lists/ArchLinux++x86_64 +++ b/qa/admin/package-lists/ArchLinux++x86_64 @@ -10,7 +10,6 @@ XML::TokeParser cpan extra/apache core/audit core/autoconf -extra/avahi core/bash extra/bc extra/bind diff --git a/qa/admin/package-lists/CentOS+7+x86_64 b/qa/admin/package-lists/CentOS+7+x86_64 index 7491d6497fb..fa3b92ebc93 100644 --- a/qa/admin/package-lists/CentOS+7+x86_64 +++ b/qa/admin/package-lists/CentOS+7+x86_64 @@ -7,8 +7,6 @@ Coin3-devel Spreadsheet::Read cpan audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/CentOS+Stream10+x86_64 b/qa/admin/package-lists/CentOS+Stream10+x86_64 index 9f7d75e19a3..c5cbba5aa38 100644 --- a/qa/admin/package-lists/CentOS+Stream10+x86_64 +++ b/qa/admin/package-lists/CentOS+Stream10+x86_64 @@ -5,8 +5,6 @@ HdrHistogram_c Spreadsheet::Read cpan Spreadsheet::ReadSXC cpan 389-ds-base -avahi-devel -avahi-tools audit autoconf bash diff --git a/qa/admin/package-lists/CentOS+Stream8+x86_64 b/qa/admin/package-lists/CentOS+Stream8+x86_64 index ba5d101180b..e662358a1cc 100644 --- a/qa/admin/package-lists/CentOS+Stream8+x86_64 +++ b/qa/admin/package-lists/CentOS+Stream8+x86_64 @@ -7,7 +7,6 @@ Net::SNMP cpan Spreadsheet::Read cpan Spreadsheet::XLSX cpan audit -avahi-tools autoconf bash bc diff --git a/qa/admin/package-lists/CentOS+Stream9+x86_64 b/qa/admin/package-lists/CentOS+Stream9+x86_64 index c0a673b5b04..652169939b9 100644 --- a/qa/admin/package-lists/CentOS+Stream9+x86_64 +++ b/qa/admin/package-lists/CentOS+Stream9+x86_64 @@ -7,8 +7,6 @@ HdrHistogram_c Spreadsheet::Read cpan Spreadsheet::ReadSXC cpan 389-ds-base -avahi-devel -avahi-tools audit autoconf bash diff --git a/qa/admin/package-lists/Debian+11+x86_64 b/qa/admin/package-lists/Debian+11+x86_64 index 98e300bc98c..c0589faa99a 100644 --- a/qa/admin/package-lists/Debian+11+x86_64 +++ b/qa/admin/package-lists/Debian+11+x86_64 @@ -6,7 +6,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -36,7 +35,6 @@ git grep iproute2 jq -libavahi-common-dev libbpf0 libbpf-dev libclass-dbi-perl diff --git a/qa/admin/package-lists/Debian+12+aarch64 b/qa/admin/package-lists/Debian+12+aarch64 index 4c5d2708cda..ee56a676b80 100644 --- a/qa/admin/package-lists/Debian+12+aarch64 +++ b/qa/admin/package-lists/Debian+12+aarch64 @@ -6,7 +6,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -35,7 +34,6 @@ git grep iproute2 jq -libavahi-common-dev libbpf1 libbpf-dev libclass-dbi-perl diff --git a/qa/admin/package-lists/Debian+12+i686 b/qa/admin/package-lists/Debian+12+i686 index 6e4c2db491f..30daf7bdae3 100644 --- a/qa/admin/package-lists/Debian+12+i686 +++ b/qa/admin/package-lists/Debian+12+i686 @@ -7,7 +7,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -38,7 +37,6 @@ grep iproute2 jq kubernetes-client -libavahi-common-dev libbpf1 libbpf-dev libclass-dbi-perl diff --git a/qa/admin/package-lists/Debian+12+x86_64 b/qa/admin/package-lists/Debian+12+x86_64 index f002213e10e..8ff6f199545 100644 --- a/qa/admin/package-lists/Debian+12+x86_64 +++ b/qa/admin/package-lists/Debian+12+x86_64 @@ -9,7 +9,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -41,7 +40,6 @@ grep iproute2 jq kubernetes-client -libavahi-common-dev libbpf1 libbpf-dev libclass-dbi-perl diff --git a/qa/admin/package-lists/Debian+13+i686 b/qa/admin/package-lists/Debian+13+i686 index aa335e40d14..c976f4c821d 100644 --- a/qa/admin/package-lists/Debian+13+i686 +++ b/qa/admin/package-lists/Debian+13+i686 @@ -6,7 +6,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -37,7 +36,6 @@ grep iproute2 jq kubernetes-client -libavahi-common-dev libbpf1 libbpf-dev libclass-dbi-perl diff --git a/qa/admin/package-lists/Debian+13+x86_64 b/qa/admin/package-lists/Debian+13+x86_64 index 2cc0b2e4c2b..fb8c5a73429 100644 --- a/qa/admin/package-lists/Debian+13+x86_64 +++ b/qa/admin/package-lists/Debian+13+x86_64 @@ -6,7 +6,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -38,7 +37,6 @@ grep iproute2 jq kubernetes-client -libavahi-common-dev libbpf1 libbpf-dev libclass-dbi-perl diff --git a/qa/admin/package-lists/Debian+14+x86_64 b/qa/admin/package-lists/Debian+14+x86_64 index 95a4686b410..9464ac98b51 100644 --- a/qa/admin/package-lists/Debian+14+x86_64 +++ b/qa/admin/package-lists/Debian+14+x86_64 @@ -7,7 +7,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -39,7 +38,6 @@ grep iproute2 jq kubernetes-client -libavahi-common-dev libbpf-dev libbpf1 libclass-dbi-perl diff --git a/qa/admin/package-lists/Fedora+42+aarch64 b/qa/admin/package-lists/Fedora+42+aarch64 index ac998f7e773..c4a2a1b389a 100644 --- a/qa/admin/package-lists/Fedora+42+aarch64 +++ b/qa/admin/package-lists/Fedora+42+aarch64 @@ -8,8 +8,6 @@ HdrHistogram_c-devel SoQt-devel audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Fedora+42+x86_64 b/qa/admin/package-lists/Fedora+42+x86_64 index c5c03137159..2c76c948c02 100644 --- a/qa/admin/package-lists/Fedora+42+x86_64 +++ b/qa/admin/package-lists/Fedora+42+x86_64 @@ -10,8 +10,6 @@ Spreadsheet::Read cpan Spreadsheet::ReadSXC cpan audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Fedora+43+aarch64 b/qa/admin/package-lists/Fedora+43+aarch64 index d5a2b606452..e96d484ed2c 100644 --- a/qa/admin/package-lists/Fedora+43+aarch64 +++ b/qa/admin/package-lists/Fedora+43+aarch64 @@ -8,8 +8,6 @@ HdrHistogram_c-devel SoQt-devel audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Fedora+43+x86_64 b/qa/admin/package-lists/Fedora+43+x86_64 index 6b713aea1b4..e4b5219ee59 100644 --- a/qa/admin/package-lists/Fedora+43+x86_64 +++ b/qa/admin/package-lists/Fedora+43+x86_64 @@ -9,8 +9,6 @@ SoQt-devel Spreadsheet::Read cpan audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Fedora+44+aarch64 b/qa/admin/package-lists/Fedora+44+aarch64 index 67ea1294415..36c69166c18 100644 --- a/qa/admin/package-lists/Fedora+44+aarch64 +++ b/qa/admin/package-lists/Fedora+44+aarch64 @@ -8,8 +8,6 @@ HdrHistogram_c-devel SoQt-devel audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Fedora+44+x86_64 b/qa/admin/package-lists/Fedora+44+x86_64 index 166025bb98b..f1648cd0cfd 100644 --- a/qa/admin/package-lists/Fedora+44+x86_64 +++ b/qa/admin/package-lists/Fedora+44+x86_64 @@ -9,8 +9,6 @@ SoQt-devel Spreadsheet::Read cpan audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Fedora+45+aarch64 b/qa/admin/package-lists/Fedora+45+aarch64 index 0f384326a8a..0f8936901d3 100644 --- a/qa/admin/package-lists/Fedora+45+aarch64 +++ b/qa/admin/package-lists/Fedora+45+aarch64 @@ -8,8 +8,6 @@ HdrHistogram_c-devel SoQt-devel audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Fedora+45+x86_64 b/qa/admin/package-lists/Fedora+45+x86_64 index 424ca79f3fa..1578325f3cc 100644 --- a/qa/admin/package-lists/Fedora+45+x86_64 +++ b/qa/admin/package-lists/Fedora+45+x86_64 @@ -9,8 +9,6 @@ SoQt-devel Spreadsheet::Read cpan audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/FreeBSD+14+amd64 b/qa/admin/package-lists/FreeBSD+14+amd64 index abb9209821a..d507f3a572f 100644 --- a/qa/admin/package-lists/FreeBSD+14+amd64 +++ b/qa/admin/package-lists/FreeBSD+14+amd64 @@ -3,8 +3,6 @@ # apache24 autoconf -avahi -avahi-app bash bison cmocka diff --git a/qa/admin/package-lists/FreeBSD+14+i386 b/qa/admin/package-lists/FreeBSD+14+i386 index 245be2961a1..c5dcd083c46 100644 --- a/qa/admin/package-lists/FreeBSD+14+i386 +++ b/qa/admin/package-lists/FreeBSD+14+i386 @@ -3,8 +3,6 @@ # apache24 autoconf -avahi -avahi-app bash bison cmocka diff --git a/qa/admin/package-lists/FreeBSD+15+amd64 b/qa/admin/package-lists/FreeBSD+15+amd64 index 32a2e9fb8af..fc2164bc67b 100644 --- a/qa/admin/package-lists/FreeBSD+15+amd64 +++ b/qa/admin/package-lists/FreeBSD+15+amd64 @@ -3,8 +3,6 @@ # apache24 autoconf -avahi -avahi-app bash bison cmocka diff --git a/qa/admin/package-lists/MX+23.6+x86_64 b/qa/admin/package-lists/MX+23.6+x86_64 index 157ab6e3c66..797804a9cb2 100644 --- a/qa/admin/package-lists/MX+23.6+x86_64 +++ b/qa/admin/package-lists/MX+23.6+x86_64 @@ -7,7 +7,6 @@ apache2-bin auditd autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -39,7 +38,6 @@ grep iproute2 jq kubernetes-client -libavahi-common-dev libbpf-dev libbpf1 libclass-dbi-perl diff --git a/qa/admin/package-lists/OpenBSD+7.6+i386 b/qa/admin/package-lists/OpenBSD+7.6+i386 index 049e33dc142..d93aede6b59 100644 --- a/qa/admin/package-lists/OpenBSD+7.6+i386 +++ b/qa/admin/package-lists/OpenBSD+7.6+i386 @@ -7,8 +7,6 @@ Spreadsheet::ReadSXC cpan Spreadsheet::XLSX cpan XML::TokeParser cpan autoconf -avahi -avahi-libs bash bison cmocka diff --git a/qa/admin/package-lists/OpenBSD+7.7+amd64 b/qa/admin/package-lists/OpenBSD+7.7+amd64 index 1d9036d3d83..bb9bcbea1ab 100644 --- a/qa/admin/package-lists/OpenBSD+7.7+amd64 +++ b/qa/admin/package-lists/OpenBSD+7.7+amd64 @@ -7,8 +7,6 @@ Spreadsheet::ReadSXC cpan Spreadsheet::XLSX cpan XML::TokeParser cpan autoconf -avahi -avahi-libs bash bison cmocka diff --git a/qa/admin/package-lists/OpenBSD+7.8+i386 b/qa/admin/package-lists/OpenBSD+7.8+i386 index 53268296499..45cca41f6ea 100644 --- a/qa/admin/package-lists/OpenBSD+7.8+i386 +++ b/qa/admin/package-lists/OpenBSD+7.8+i386 @@ -6,8 +6,6 @@ Spreadsheet::ReadSXC cpan Spreadsheet::XLSX cpan XML::TokeParser cpan autoconf -avahi -avahi-libs bash bison cmocka diff --git a/qa/admin/package-lists/OpenIndiana+2025.10+i86pc b/qa/admin/package-lists/OpenIndiana+2025.10+i86pc index b9175986f45..9395aeed600 100644 --- a/qa/admin/package-lists/OpenIndiana+2025.10+i86pc +++ b/qa/admin/package-lists/OpenIndiana+2025.10+i86pc @@ -57,7 +57,6 @@ system/file-system/zfs system/header system/library/security/libsasl system/man -system/network/avahi text/gawk text/gnu-grep text/gnu-sed diff --git a/qa/admin/package-lists/RHEL+10+x86_64 b/qa/admin/package-lists/RHEL+10+x86_64 index 7bab94979ed..fe5f4f47a22 100644 --- a/qa/admin/package-lists/RHEL+10+x86_64 +++ b/qa/admin/package-lists/RHEL+10+x86_64 @@ -7,8 +7,6 @@ HdrHistogram_c 389-ds-base audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/RHEL+9+x86_64 b/qa/admin/package-lists/RHEL+9+x86_64 index cc2e9fcae8d..3d40352cd6f 100644 --- a/qa/admin/package-lists/RHEL+9+x86_64 +++ b/qa/admin/package-lists/RHEL+9+x86_64 @@ -8,8 +8,6 @@ Spreadsheet::ReadSXC cpan 389-ds-base audit autoconf -avahi-devel -avahi-tools bash bc bind-utils diff --git a/qa/admin/package-lists/Ubuntu+18.04+i686 b/qa/admin/package-lists/Ubuntu+18.04+i686 index 22ba783c3bd..7eb6111f0c5 100644 --- a/qa/admin/package-lists/Ubuntu+18.04+i686 +++ b/qa/admin/package-lists/Ubuntu+18.04+i686 @@ -7,7 +7,6 @@ apache2-bin auditd not4ci autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -37,7 +36,6 @@ git grep iproute2 jq -libavahi-common-dev libclass-dbi-perl libcmocka-dev libdrm-dev diff --git a/qa/admin/package-lists/Ubuntu+18.04+x86_64 b/qa/admin/package-lists/Ubuntu+18.04+x86_64 index db24f08b8a7..4516770b7c3 100644 --- a/qa/admin/package-lists/Ubuntu+18.04+x86_64 +++ b/qa/admin/package-lists/Ubuntu+18.04+x86_64 @@ -7,7 +7,6 @@ apache2-bin auditd not4ci autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -34,7 +33,6 @@ gfs2-utils git grep iproute2 -libavahi-common-dev libclass-dbi-perl libcmocka-dev libdbd-mysql-perl diff --git a/qa/admin/package-lists/Ubuntu+20.04+x86_64 b/qa/admin/package-lists/Ubuntu+20.04+x86_64 index ec2f27c38ea..2bab5e76ae7 100644 --- a/qa/admin/package-lists/Ubuntu+20.04+x86_64 +++ b/qa/admin/package-lists/Ubuntu+20.04+x86_64 @@ -7,7 +7,6 @@ apache2-bin auditd not4ci autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -38,7 +37,6 @@ git grep iproute2 jq -libavahi-common-dev libbpf-dev libbpf0 libclass-dbi-perl diff --git a/qa/admin/package-lists/Ubuntu+22.04+x86_64 b/qa/admin/package-lists/Ubuntu+22.04+x86_64 index e62c0e82a83..b9f4cd3a9b0 100644 --- a/qa/admin/package-lists/Ubuntu+22.04+x86_64 +++ b/qa/admin/package-lists/Ubuntu+22.04+x86_64 @@ -6,7 +6,6 @@ apache2-bin auditd not4ci autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -40,7 +39,6 @@ git grep iproute2 jq -libavahi-common-dev libbpf-dev libbpf0 libclass-dbi-perl diff --git a/qa/admin/package-lists/Ubuntu+24.04+any b/qa/admin/package-lists/Ubuntu+24.04+any index a1606ab0fbb..4ef4c87d85a 100644 --- a/qa/admin/package-lists/Ubuntu+24.04+any +++ b/qa/admin/package-lists/Ubuntu+24.04+any @@ -5,7 +5,6 @@ apache2-bin auditd not4ci autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -39,7 +38,6 @@ git grep iproute2 jq -libavahi-common-dev libbpf-dev libbpf1 libclass-dbi-perl diff --git a/qa/admin/package-lists/Ubuntu+24.04+x86_64 b/qa/admin/package-lists/Ubuntu+24.04+x86_64 index d35fd54fd10..bfa71e37d1b 100644 --- a/qa/admin/package-lists/Ubuntu+24.04+x86_64 +++ b/qa/admin/package-lists/Ubuntu+24.04+x86_64 @@ -5,7 +5,6 @@ apache2-bin auditd not4ci autoconf autotools-dev -avahi-utils bash bc bind9-host @@ -39,7 +38,6 @@ git grep iproute2 jq -libavahi-common-dev libbpf-dev libbpf1 libclass-dbi-perl diff --git a/qa/admin/package-lists/openSUSE+15.6+x86_64 b/qa/admin/package-lists/openSUSE+15.6+x86_64 index 91ed23cae28..22b4016ab0b 100644 --- a/qa/admin/package-lists/openSUSE+15.6+x86_64 +++ b/qa/admin/package-lists/openSUSE+15.6+x86_64 @@ -10,7 +10,6 @@ aaa_base apache2 audit autoconf -avahi-utils bash bc bind-utils @@ -44,7 +43,6 @@ iproute2 jq kubernetes-client kubernetes-kubelet -libavahi-devel libbpf-devel libcmocka-devel libdrm-devel diff --git a/qa/admin/package-lists/openSUSE+16.0+x86_64 b/qa/admin/package-lists/openSUSE+16.0+x86_64 index bffdb0ce8f2..b11b78028d9 100644 --- a/qa/admin/package-lists/openSUSE+16.0+x86_64 +++ b/qa/admin/package-lists/openSUSE+16.0+x86_64 @@ -10,7 +10,6 @@ aaa_base apache2 audit autoconf -avahi-utils bash bc bind-utils @@ -42,7 +41,6 @@ git-core grep iproute2 jq -libavahi-devel libbpf-devel libcmocka-devel libdrm-devel diff --git a/qa/common.discovery b/qa/common.discovery index 04253923712..1773766fd0b 100644 --- a/qa/common.discovery +++ b/qa/common.discovery @@ -81,119 +81,4 @@ _check_service_discovery() { _get_libpcp_config $service_discovery || _notrun "No support for service discovery" - - avahi-daemon --check 2>/dev/null || _notrun "avahi-daemon is unavailable" -} - -_check_avahi_service() -{ - _check_service_discovery - which avahi-browse >/dev/null 2>&1 || _notrun "avahi-browse not installed" -} - -_cleanup_avahi_service() -{ - cd $here - echo "avahi_cleanup: before pmsignal" >>$seq_full - __grep_service=`echo "$service" | sed -e 's/./[&]/'` - $PCP_PS_PROG $PCP_PS_ALL_FLAGS | grep -E '[P]PID|$__grep_service |$__grep_service$' >>$seq_full - $sudo $PCP_BINADM_DIR/pmsignal -a "$service" >>$seq_full 2>&1 - pmsleep 0.5 - echo "avahi_cleanup: after pmsignal" >>$seq_full - $PCP_PS_PROG $PCP_PS_ALL_FLAGS | grep -E '[P]PID|$__grep_service |$__grep_service$' >>$seq_full - _restore_config $PCP_PMCDOPTIONS_PATH - _restore_config $PCP_PMPROXYOPTIONS_PATH - if $__service_was_running - then - echo "Restart $service ..." >>$seq_full - _service $service restart >>$seq_full 2>&1 - case "$service" - in - pmcd) - _wait_for_pmcd - ;; - pmproxy) - _wait_for_pmproxy - ;; - esac - else - echo "Stopping $service ..." >>$seq_full - _service $service stop >>$seq_full 2>&1 - fi - $sudo rm -rf $tmp $tmp.* -} - -_control_avahi_service() -{ - _save_config $PCP_PMPROXYOPTIONS_PATH - cp $PCP_PMPROXYOPTIONS_PATH $tmp.options - echo "# edited for PCP QA test $seq" >$tmp.options - sed <$PCP_PMPROXYOPTIONS_PATH >>$tmp.options \ - -e '/^-A/s/.*/# for PCP QA -A/' - $sudo cp $tmp.options $PCP_PMPROXYOPTIONS_PATH - - _save_config $PCP_PMCDOPTIONS_PATH - cp $PCP_PMCDOPTIONS_PATH $tmp.options - echo "# edited for PCP QA test $seq" >$tmp.options - sed <$PCP_PMCDOPTIONS_PATH >>$tmp.options \ - -e '/^-A/s/.*/# for PCP QA -A/' - $sudo cp $tmp.options $PCP_PMCDOPTIONS_PATH - - __service_was_running=false - [ -f $PCP_RUN_DIR/$service.pid ] && __service_was_running=true - echo "__service_was_running=$__service_was_running" >>$seq_full - _stop_auto_restart $service - $sudo "$PCP_RC_DIR/$service" restart >>$seq_full 2>&1 - case "$service" - in - pmcd) - _wait_for_pmcd - ;; - pmproxy) - _wait_for_pmproxy - ;; - esac - _restore_auto_restart $service - - _control_service_discovery -} - -_verify_avahi_service() -{ - __msg="$@" - - [ "X$__msg" = "X" ] && __msg="Verify $service avahi service advertising" - echo $__msg | tee -a $seq_full - - # strip any domain part ... e.g. if hostname is vm08.localdomain, - # avahi reports this as vm08.local - # look for a line like this ... - # = eth0 IPv4 PCP pmproxy on vm04.localdomain _pmproxy._tcp local - # + eth0 IPv6 PCP pmproxy on vm30 _pmroxy._tcp local - # - __hostname=`hostname | sed -e 's/\..*//'` - echo "__hostname=$__hostname" >>$seq_full - echo "avahi-browse -rt -d local _$service._tcp" >> $seq_full - avahi-browse -rt -d local "_$service._tcp" > $tmp.out 2> $tmp.err - # sometimes we need a fair bit of time for avahi to register - for __i in 0.1 0.3 1 2 3 - do - [ -s $tmp.out ] && break - pmsleep $__i - avahi-browse -rt -d local "_$service._tcp" > $tmp.out 2> $tmp.err - done - cat $tmp.err >>$seq_full - cat $tmp.out | \ - tee -a $seq_full | \ - sed -n \ - -e '/ '"$__hostname"'[ .]/{ -s/ */ /g -s/'"$__hostname"'[^ ]*/HOSTNAME/ -s/[=+] [^ ]* /. / -s/ IPv[46] / / -s/ \#[0-9] / / -p -q -}' - } diff --git a/qa/common.filter b/qa/common.filter index ed78cd7adf0..5c2fe62f2a6 100644 --- a/qa/common.filter +++ b/qa/common.filter @@ -37,7 +37,6 @@ _filter_pmcd_log() -e '/Using cipher /d' \ -e '/using .* kmem interface/d' \ -e '/pmcd_wait failed: exit status:/d' \ - -e '/Failed to create avahi client:/d' \ -e 's/: host-based access control/: access control/g' \ -e '/^User access list empty: user-based access control turned off$/d' \ -e '/^Group access list empty: group-based access control turned off$/d' \ @@ -163,7 +162,6 @@ _filter_pmproxy_log() -e '/^pmproxy: disabled time series,.*(missing)/d' \ -e '/Error: .*unsupported key server (got v/d' \ -e '/Info: TLS configured in pmproxy.conf/d' \ - -e '/Failed to create avahi client:/d' \ -e '/Info: connected to .*key server.*/d' \ -e '/Info: .* setup$/d' \ -e '/Info: OpenSSL /d' \ @@ -662,7 +660,6 @@ s/Performance Co-Pilot starting archive loggers .../Starting pmlogger ... / -e '/^[ ]*$/d' \ -e '/is not a native service, redirecting to .*chkconfig/d' \ -e '/^Executing .*chkconfig pm.* --level=5/d' \ - -e '/Failed to create avahi client:/d' \ -e '/pmsignal.* kill: [0-9][0-9]*: No such process/d' \ | _filter_pcp_start_distro \ | _filter_init_distro diff --git a/qa/group b/qa/group index 1c1008ffce3..6506fc506fe 100644 --- a/qa/group +++ b/qa/group @@ -388,9 +388,6 @@ pmlogrewrite # log checking pmlogcheck -# uses avahi -avahi - # zabbix exporting zbxpcp @@ -1261,10 +1258,10 @@ suse 721 dbpmda local pmda.sample 722 python local pcp 723 pmda.proc local -724 pmfind local +724:retired pmfind local 725 pmda.jbd2 local 726 pmlogger pmlogdump local -727:retired avahi local +727:retired local 728 libpcp getopt local timezone 729 python local 730 pmda.proc local cgroups @@ -1312,7 +1309,7 @@ suse 772 pmns local 773 derive local 774 pmlogdump local -775 pmfind local not_in_container +775:retired pmfind local not_in_container 776 pmfind local 777 derive pmprobe pmie local pmval 778 pmda.postgresql pmie local @@ -1377,7 +1374,7 @@ suse 837 pmda.sample containers local pmval pmstore pmprobe pmdbg 838 pmns local 839 pcp python local -840 avahi local +840:retired local 841 pmda local python 842 python local iostat pmval pcp kernel 843 pmda local python @@ -1483,11 +1480,11 @@ suse 943 pmprobe pmda.proc local 944 pmcd secure local pmstore pmda.sample pmconfig 945 pmlogrewrite pmda.xfs local pmlogdump -946 pmfind avahi local +946:retired pmfind local 947 pmlogger local pmlogdump pmda.sample 948 pmlogger context_local local pmlogcheck pmlogdump kernel pmda.sample pmlc 949 python local timezone -950 pmproxy avahi local +950:retired pmproxy local 951 pmie local pmval kernel 952 threads valgrind local helgrind pmda.sample 953 libpcp threads local diff --git a/scripts/man-spell b/scripts/man-spell index 9658ee46894..c87b182c537 100755 --- a/scripts/man-spell +++ b/scripts/man-spell @@ -446,7 +446,6 @@ xz # libpcp_static libpcp_trace libpcp_web # ! ANY_SIZE -AVAHI_DISCOVERY_TIMEOUT ! CVERSION ! DEFAULT_SECURITY_STRENGTH ! DYNAMIC_PMID diff --git a/src/include/builddefs.in b/src/include/builddefs.in index e60e2342ea0..6a23a2a2485 100644 --- a/src/include/builddefs.in +++ b/src/include/builddefs.in @@ -133,7 +133,6 @@ PIECFLAGS = @PIECFLAGS@ PIELDFLAGS = @PIELDFLAGS@ INVISIBILITY = @INVISIBILITY@ # hide shared library symbols -AVAHICFLAGS = @avahi_CFLAGS@ LZMACFLAGS = @lzma_CFLAGS@ LIBUVCFLAGS = @libuv_CFLAGS@ OPENSSLCFLAGS = @openssl_CFLAGS@ @@ -265,7 +264,6 @@ CLANG_MAJOR_VERSION = @CLANG_MAJOR_VERSION@ ENABLE_MULTILIB = @enable_multilib@ ENABLE_SHARED = @enable_shared@ ENABLE_SECURE = @enable_secure@ -ENABLE_AVAHI = @enable_avahi@ ENABLE_DSTAT = @enable_dstat@ ENABLE_QT = @enable_qt@ ENABLE_QT3D = @enable_qt3d@ @@ -297,7 +295,6 @@ HAVE_HICOLOR_ICONS = @have_hicolor_icons@ # additional libraries needed for particular functions LIB_FOR_ATOMIC = @lib_for_atomic@ -LIB_FOR_AVAHI = @lib_for_avahi@ LIB_FOR_BASENAME = @lib_for_basename@ LIB_FOR_CHAN = @lib_for_chan@ LIB_FOR_CURSES = @lib_for_curses@ diff --git a/src/include/pcp/config.h.in b/src/include/pcp/config.h.in index b5ba15b0f02..f693dd4560c 100644 --- a/src/include/pcp/config.h.in +++ b/src/include/pcp/config.h.in @@ -17,15 +17,6 @@ /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT -/* Service discovery via Avahi */ -#undef HAVE_AVAHI - -/* Define to 1 if you have the header file. */ -#undef HAVE_AVAHI_CLIENT_PUBLISH_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_AVAHI_COMMON_ALTERNATIVE_H - /* Define to 1 if you have the `backtrace' function. */ #undef HAVE_BACKTRACE diff --git a/src/libpcp/doc/GNUmakefile b/src/libpcp/doc/GNUmakefile index 26445b76a35..47008789ace 100644 --- a/src/libpcp/doc/GNUmakefile +++ b/src/libpcp/doc/GNUmakefile @@ -3,7 +3,7 @@ # PNGFILES = access.png accounts.png AF.png auxconnect.png \ - auxserver.png avahi.png config.png \ + auxserver.png config.png \ connect.png connectlocal.png context.png \ derive_parser.png derive_fetch.png desc.png discovery.png \ endian.png err.png events.png fault.png \ diff --git a/src/libpcp/src/GNUlibrarydefs b/src/libpcp/src/GNUlibrarydefs index 519124eb16a..c5bcac9ab4b 100644 --- a/src/libpcp/src/GNUlibrarydefs +++ b/src/libpcp/src/GNUlibrarydefs @@ -8,11 +8,6 @@ LIBPCP_LDLIBS += $(LIB_FOR_OPENSSL) $(LIB_FOR_LIBSASL2) LIBPCP_CFLAGS += $(OPENSSLCFLAGS) $(SASLCFLAGS) endif -ifeq "$(ENABLE_AVAHI)" "true" -LIBPCP_LDLIBS += $(LIB_FOR_AVAHI) -LIBPCP_CFLAGS += $(AVAHICFLAGS) -endif - ifeq "$(ENABLE_LZMA)" "true" LIBPCP_LDLIBS += $(LIB_FOR_LZMA) LIBPCP_CFLAGS += $(LZMACFLAGS) diff --git a/src/libpcp/src/GNUmakefile b/src/libpcp/src/GNUmakefile index 750d50f5a4d..4db580b4898 100644 --- a/src/libpcp/src/GNUmakefile +++ b/src/libpcp/src/GNUmakefile @@ -44,7 +44,7 @@ CFILES = connect.c context.c desc.c err.c fetch.c fetchgroup.c result.c \ e_loglabel.c e_index.c e_indom.c e_labels.c throttle.c \ $(JSONSL_CFILES) HFILES = derive.h internal.h compiler.h pmdbg.h sha256.h sort_r.h \ - avahi.h subnetprobe.h shellprobe.h \ + subnetprobe.h shellprobe.h \ $(JSONSL_HFILES) XFILES = sha256.c sha256.h sort_r.h YFILES = getdate.y derive_parser.y @@ -61,10 +61,6 @@ ifeq "$(ENABLE_SECURE)" "true" CFILES += secureserver.c secureconnect.c endif -ifeq "$(ENABLE_AVAHI)" "true" -CFILES += avahi.c -endif - ifeq "$(ENABLE_LZMA)" "true" CFILES += io_xz.c endif diff --git a/src/libpcp/src/avahi.c b/src/libpcp/src/avahi.c deleted file mode 100644 index 06b75ffe635..00000000000 --- a/src/libpcp/src/avahi.c +++ /dev/null @@ -1,806 +0,0 @@ -/* - * Copyright (c) 2013-2015,2019-2020 Red Hat. - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pmapi.h" -#include "libpcp.h" -#include "internal.h" -#include "avahi.h" - -/* Support for servers advertising their presence. */ -static AvahiThreadedPoll *threadedPoll; -static AvahiClient *client; -static AvahiEntryGroup *group; - -static __pmServerPresence **activeServices; -static int nActiveServices; -static int szActiveServices; - -struct __pmServerAvahiPresence { - char *serviceName; - char *serviceTag; - int collisions; -}; - -static void entryGroupCallback(AvahiEntryGroup *, AvahiEntryGroupState, void *); - -static int -renameService(__pmServerPresence *s) -{ - /* - * Each service must have a unique name on the local network. - * When there is a collision, we try to rename the service. - * However, we need to limit the number of attempts, since the - * service namespace could be maliciously flooded with service - * names designed to maximize collisions. - * Arbitrarily choose a limit of 65535, which is the number of - * TCP ports. - */ - ++s->avahi->collisions; - if (s->avahi->collisions >= 65535) { - pmNotifyErr(LOG_ERR, "Too many service name collisions for Avahi service %s", - s->avahi->serviceTag); - return -EBUSY; - } - - /* - * Use the avahi-supplied function to generate a new service name. - */ - char *n = avahi_alternative_service_name(s->avahi->serviceName); - - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Avahi service name collision, renaming service '%s' to '%s'", - s->avahi->serviceName, n); - avahi_free(s->avahi->serviceName); - s->avahi->serviceName = n; - - return 0; -} - -static int -renameServices(void) -{ - int i; - int rc = 0; - __pmServerPresence *s; - - for (i = 0; i < szActiveServices; ++i) { - s = activeServices[i]; - if (s == NULL) - continue; /* empty entry */ - if ((rc = renameService(s)) < 0) - break; - } - - return rc; -} - -static void -createServices(AvahiClient *c) -{ - __pmServerPresence *s; - int ret; - int i; - - /* - * Create a new entry group, if necessary, or reset the existing one. - */ - if (group == NULL) { - if ((group = avahi_entry_group_new(c, entryGroupCallback, NULL)) == NULL) { - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_ERR, "avahi_entry_group_new failed: %s", - avahi_strerror(avahi_client_errno(c))); - return; - } - } - else - avahi_entry_group_reset(group); - - /* - * We will now add our services to the entry group. - */ - for (i = 0; i < szActiveServices; ++i) { - s = activeServices[i]; - if (s == NULL) - continue; /* empty table entry */ - - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Adding %s Avahi service on port %d", - s->avahi->serviceName, s->port); - - /* Loop until no collisions */ - for (;;) { - ret = avahi_entry_group_add_service(group, AVAHI_IF_UNSPEC, - AVAHI_PROTO_UNSPEC, - (AvahiPublishFlags)0, - s->avahi->serviceName, - s->avahi->serviceTag, - NULL, NULL, s->port, NULL); - if (ret == AVAHI_OK) - break; /* success! */ - if (ret == AVAHI_ERR_COLLISION) { - /* - * A service name collision with a local service happened. - * Pick a new name. Since a service may be listening on - * multiple ports, this is expected to happen sometimes - - * do not issue warnings here. - */ - if (renameService(s) < 0) { - /* Too many collisions. Message already issued */ - goto fail; - } - continue; /* try again */ - } - - pmNotifyErr(LOG_ERR, "Failed to add %s Avahi service on port %d: %s", - s->avahi->serviceName, s->port, avahi_strerror(ret)); - goto fail; - } - } - - /* Tell the server to register the services. */ - if ((ret = avahi_entry_group_commit(group)) < 0) { - pmNotifyErr(LOG_ERR, "Failed to commit avahi entry group: %s", - avahi_strerror(ret)); - goto fail; - } - - return; - - fail: - avahi_entry_group_reset(group); -} - -static void -entryGroupCallback(AvahiEntryGroup *g, AvahiEntryGroupState state, void *data) -{ - (void)data; - - assert(group == NULL || group == g); - group = g; - - /* Called whenever the entry group state changes. */ - switch (state) { - case AVAHI_ENTRY_GROUP_ESTABLISHED: - /* The entry group has been established successfully. */ - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Avahi services successfully established."); - break; - - case AVAHI_ENTRY_GROUP_COLLISION: - /* - * A service name collision with a remote service happened. - * Unfortunately, we don't know which entry collided. - * We need to rename them all and recreate the services. - */ - if (renameServices() == 0) - createServices(avahi_entry_group_get_client(g)); - break; - - case AVAHI_ENTRY_GROUP_FAILURE: - /* Some kind of failure happened. */ - pmNotifyErr(LOG_ERR, "Avahi entry group failure: %s", - avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g)))); - break; - - case AVAHI_ENTRY_GROUP_UNCOMMITED: - case AVAHI_ENTRY_GROUP_REGISTERING: - break; - } -} - -static void -cleanupClient(void) -{ - /* This also frees the entry group, if any. */ - if (client) { - avahi_client_free(client); - client = NULL; - group = NULL; - } -} - -static void -advertisingClientCallback(AvahiClient *c, AvahiClientState state, void *userData) -{ - (void)userData; - - /* Called whenever the client or server state changes. */ - switch (state) { - case AVAHI_CLIENT_S_RUNNING: - /* - * The server has started successfully and registered its host - * name on the network, so it's time to create our services. - */ - createServices(c); - break; - - case AVAHI_CLIENT_FAILURE: - pmNotifyErr(LOG_ERR, "Avahi client failure: %s", - avahi_strerror(avahi_client_errno(c))); - if (avahi_client_errno (c) == AVAHI_ERR_DISCONNECTED) { - int error; - /* - * The client has been disconnected; probably because the - * avahi daemon has been restarted. We can free the client - * here and try to reconnect using a new one. - * Passing AVAHI_CLIENT_NO_FAIL allows the new client to be - * created, even if the avahi daemon is not running. Our - * service will be advertised if/when the daemon is started. - */ - cleanupClient(); - client = avahi_client_new(avahi_threaded_poll_get(threadedPoll), - (AvahiClientFlags)AVAHI_CLIENT_NO_FAIL, - advertisingClientCallback, NULL, & error); - } - break; - - case AVAHI_CLIENT_S_COLLISION: - /* - * Drop our registered services. When the server is back - * in AVAHI_SERVER_RUNNING state we will register them - * again with the new host name. - * Fall through ... - */ - case AVAHI_CLIENT_S_REGISTERING: - /* - * The server records are now being established. This - * might be caused by a host name change. We need to wait - * for our own records to register until the host name is - * properly esatblished. - */ - if (group) - avahi_entry_group_reset (group); - break; - - case AVAHI_CLIENT_CONNECTING: - /* - * The avahi-daemon is not currently running. Our service will be - * advertised if/when the daemon is started. - */ - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, - "The Avahi daemon is not running. " - "Avahi services will be established when the daemon is started"); - break; - } -} - -static void -cleanup(__pmServerAvahiPresence *s) -{ - if (s == NULL) - return; - - if (s->serviceName) { - avahi_free(s->serviceName); - s->serviceName = NULL; - } - if (s->serviceTag) { - avahi_free(s->serviceTag); - s->serviceTag = NULL; - } -} - -/* Add a new serice to the active services list. */ -static void -addService(__pmServerPresence *s) -{ - int i; - size_t size; - - /* Find an empty slot in the table of active services. */ - for (i = 0; i < szActiveServices; ++i) { - if (activeServices[i] == NULL) - break; - } - - /* Do we need to grow the table? */ - if (i >= szActiveServices) { - ++szActiveServices; - size = szActiveServices * sizeof(*activeServices); - activeServices = realloc(activeServices, size); - if (activeServices == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate service table", - size, PM_FATAL_ERR); - } - } - - /* Add the service to the table. */ - activeServices[i] = s; - ++nActiveServices; -} - -/* Remove a service from the active services list. */ -static void -removeService(__pmServerPresence *s) -{ - int i; - - /* - * Find the service in the table of active services. - * We can do this by comparing the pointers directly, since - * that's how the services were added. - */ - for (i = 0; i < szActiveServices; ++i) { - /* - * Did we find it? If so, clear the entry. - * We don't free it here. - */ - if (activeServices[i] == s) { - activeServices[i] = NULL; - --nActiveServices; - return; - } - } -} - -/* Publish a new service. */ -static void -publishService(__pmServerPresence *s) -{ - int error; - - /* Add the service to our list of active services. */ - addService(s); - - /* Is this the first service to be added? */ - if (threadedPoll == NULL) { - /* Allocate main loop object. */ - if ((threadedPoll = avahi_threaded_poll_new()) == NULL) { - pmNotifyErr(LOG_ERR, "Failed to create avahi threaded poll object."); - goto fail; - } - - /* - * Always allocate a new client. Passing AVAHI_CLIENT_NO_FAIL allows - * the client to be created, even if the avahi daemon is not running. - * Our service will be advertised if/when the daemon is started. - */ - client = avahi_client_new(avahi_threaded_poll_get(threadedPoll), - (AvahiClientFlags)AVAHI_CLIENT_NO_FAIL, - advertisingClientCallback, NULL, &error); - - /* Check whether creating the client object succeeded. */ - if (! client) { - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_WARNING, "Failed to create avahi client: %s", - avahi_strerror(error)); - goto fail; - } - - /* Start the main loop. */ - avahi_threaded_poll_start(threadedPoll); - } - else { - /* Stop the main loop while we recreate the services. */ - avahi_threaded_poll_lock(threadedPoll); - createServices(client); - avahi_threaded_poll_unlock(threadedPoll); - } - - return; - - fail: - removeService(s); - cleanup(s->avahi); - free(s->avahi); - s->avahi = NULL; -} - -void -__pmServerAvahiAdvertisePresence(__pmServerPresence *s) -{ - size_t size; - char host[MAXHOSTNAMELEN]; - - /* Allocate the avahi server presence. */ - s->avahi = malloc(sizeof(*s->avahi)); - if (s->avahi == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate avahi service data", - sizeof(*s->avahi), PM_FATAL_ERR); - } - - /* - * The service spec is simply the name of the server. Use it to - * construct the avahi service name and service tag. - * The service name cannot be longer than AVAHI_LABEL_MAX - 1. - */ - gethostname(host, sizeof(host)); - host[sizeof(host)-1] = '\0'; - - size = sizeof("PCP..on.") + strlen(host) + - strlen(s->serviceSpec); /* includes room for the nul */ - if (size > AVAHI_LABEL_MAX) - size = AVAHI_LABEL_MAX; - if ((s->avahi->serviceName = avahi_malloc(size)) == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate service name", - size, PM_FATAL_ERR); - } - pmsprintf(s->avahi->serviceName, size, "PCP %s on %s", s->serviceSpec, host); - assert(avahi_is_valid_service_name(s->avahi->serviceName)); - - size = sizeof("_._tcp") + strlen(s->serviceSpec); /* includes room for the nul */ - if ((s->avahi->serviceTag = avahi_malloc(size)) == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate service tag", - size, PM_FATAL_ERR); - } - pmsprintf(s->avahi->serviceTag, size, "_%s._tcp", s->serviceSpec); - s->avahi->collisions = 0; - - /* Now publish the avahi service. */ - publishService(s); -} - -void -__pmServerAvahiUnadvertisePresence(__pmServerPresence *s) -{ - /* Not an avahi service? */ - if (s->avahi == NULL) - return; - - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Removing Avahi service '%s' on port %d", - s->avahi->serviceName , s->port); - - /* Remove and cleanup the service. */ - removeService(s); - cleanup(s->avahi); - free(s->avahi); - s->avahi = NULL; - - /* Nothing to do if the client is not running. */ - if (threadedPoll == NULL) - return; - - /* Stop the main loop. */ - - /* If no services remain, then shut down the avahi client. */ - if (nActiveServices == 0) { - /* Clean up the avahi objects. The order of freeing these is significant. */ - avahi_threaded_poll_stop(threadedPoll); - cleanupClient(); - avahi_threaded_poll_free(threadedPoll); - threadedPoll = NULL; - return; - } - - /* Otherwise, stop the main loop while we recreate the services. */ - avahi_threaded_poll_lock(threadedPoll); - createServices(client); - avahi_threaded_poll_unlock(threadedPoll); -} - -/* Support for clients searching for services. */ -typedef struct browsingContext { - const __pmServiceDiscoveryOptions *discoveryOptions; - AvahiSimplePoll *simplePoll; - char ***urls; - int numUrls; - int error; -} browsingContext; - -/* Called whenever a service has been resolved successfully or timed out. */ -static void -resolveCallback( - AvahiServiceResolver *r, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiResolverEvent event, - const char *name, - const char *type, - const char *domain, - const char *hostName, - const AvahiAddress *address, - uint16_t port, - AvahiStringList *txt, - AvahiLookupResultFlags flags, - void *userdata -) -{ - char addressString[AVAHI_ADDRESS_STR_MAX]; - browsingContext *context = (browsingContext *)userdata; - char ***urls = context->urls; - int numUrls = context->numUrls; - __pmServiceInfo serviceInfo; - - /* Unused arguments. */ - (void)protocol; - (void)hostName; - (void)txt; - (void)flags; - - switch (event) { - case AVAHI_RESOLVER_FAILURE: - context->error = EOPNOTSUPP; - break; - - case AVAHI_RESOLVER_FOUND: - if (strcmp(type, "_" PM_SERVER_SERVICE_SPEC "._tcp") == 0) { - serviceInfo.spec = PM_SERVER_SERVICE_SPEC; - serviceInfo.protocol = SERVER_PROTOCOL; - } - else if (strcmp(type, "_" PM_SERVER_PROXY_SPEC "._tcp") == 0) { - serviceInfo.spec = PM_SERVER_PROXY_SPEC; - serviceInfo.protocol = PROXY_PROTOCOL; - } - else if (strcmp(type, "_" PM_SERVER_WEBAPI_SPEC "._tcp") == 0) { - serviceInfo.spec = PM_SERVER_WEBAPI_SPEC; - serviceInfo.protocol = WEBAPI_PROTOCOL; - } - else { - context->error = EINVAL; - break; - } - - avahi_address_snprint(addressString, sizeof(addressString), address); - serviceInfo.address = __pmStringToSockAddr(addressString); - if (serviceInfo.address == NULL) { - context->error = ENOMEM; - break; - } - __pmSockAddrSetPort(serviceInfo.address, port); - __pmSockAddrSetScope(serviceInfo.address, interface); - context->numUrls = __pmAddDiscoveredService(&serviceInfo, - context->discoveryOptions, - numUrls, urls); - __pmSockAddrFree(serviceInfo.address); - break; - - default: - break; - } - - avahi_service_resolver_free(r); -} - -/* - * Called whenever a new service becomes available on the LAN - * or is removed from the LAN. - */ -static void -browseCallback( - AvahiServiceBrowser *b, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiBrowserEvent event, - const char *name, - const char *type, - const char *domain, - AvahiLookupResultFlags flags, - void *userdata -) -{ - browsingContext *context = (browsingContext *)userdata; - AvahiClient *c = avahi_service_browser_get_client(b); - AvahiSimplePoll *simplePoll = context->simplePoll; - - /* Unused argument. */ - (void)flags; - - switch (event) { - case AVAHI_BROWSER_FAILURE: - context->error = EOPNOTSUPP; - avahi_simple_poll_quit(simplePoll); - break; - - case AVAHI_BROWSER_NEW: - /* - * We ignore the returned resolver object. In the callback - * function we free it. If the server is terminated before - * the callback function is called the server will free - * the resolver for us. - */ - if (!(avahi_service_resolver_new(c, interface, protocol, - name, type, domain, - AVAHI_PROTO_UNSPEC, (AvahiLookupFlags)0, - resolveCallback, context))) { - context->error = EOPNOTSUPP; - } - break; - - case AVAHI_BROWSER_REMOVE: - case AVAHI_BROWSER_ALL_FOR_NOW: - case AVAHI_BROWSER_CACHE_EXHAUSTED: - break; - } -} - -/* Called whenever the client or server state changes. */ -static void -browsingClientCallback(AvahiClient *c, AvahiClientState state, void *userdata) -{ - if (state == AVAHI_CLIENT_FAILURE) { - browsingContext *context = (browsingContext *)userdata; - AvahiSimplePoll *simplePoll = context->simplePoll; - context->error = EOPNOTSUPP; - avahi_simple_poll_quit(simplePoll); - } -} - -static void -timeoutCallback(AvahiTimeout *e, void *userdata) -{ - browsingContext *context = (browsingContext *)userdata; - AvahiSimplePoll *simplePoll = context->simplePoll; - (void)e; - avahi_simple_poll_quit(simplePoll); -} - - -static double -discoveryTimeout(void) -{ - static int done_default = 0; - static double def_timeout = 0.5; /* 0.5 seconds */ - - PM_LOCK(__pmLock_extcall); - if (!done_default) { - char *timeout_str; - char *end_ptr; - double new_timeout; - done_default = 1; - timeout_str = getenv("AVAHI_DISCOVERY_TIMEOUT"); /* THREADSAFE */ - if (timeout_str != NULL) { - new_timeout = strtod(timeout_str, &end_ptr); - if (*end_ptr != '\0' || def_timeout < 0.0) { - char *fromenv = strdup(timeout_str); - PM_UNLOCK(__pmLock_extcall); - pmNotifyErr(LOG_WARNING, - "ignored bad AVAHI_DISCOVERY_TIMEOUT = '%s'\n", - fromenv); - } - else { - def_timeout = new_timeout; - PM_UNLOCK(__pmLock_extcall); - } - } - else - PM_UNLOCK(__pmLock_extcall); - } - else - PM_UNLOCK(__pmLock_extcall); - - return def_timeout; -} - -int -__pmAvahiDiscoverServices(const char *service, - const char *mechanism, - const __pmServiceDiscoveryOptions *options, - int numUrls, - char ***urls) -{ - AvahiClient *ac = NULL; - AvahiServiceBrowser *sb = NULL; - AvahiSimplePoll *simplePoll; - struct timeval tv; - browsingContext context; - char *serviceTag; - size_t size; - const char *timeoutBegin; - char *timeoutEnd; - double timeout; - int sts; - - /* Allocate the main loop object. */ - if (!(simplePoll = avahi_simple_poll_new())) - return -ENOMEM; - - context.discoveryOptions = options; - context.error = 0; - context.simplePoll = simplePoll; - context.urls = urls; - context.numUrls = numUrls; - - /* Allocate a new Avahi client */ - ac = avahi_client_new(avahi_simple_poll_get(simplePoll), - (AvahiClientFlags)0, - browsingClientCallback, &context, &context.error); - - /* Check whether creating the client object succeeded. */ - if (!ac) { - /* Avahi error codes are negative, and are of no use to the caller. */ - if (context.error < 0) - context.error = EOPNOTSUPP; - goto done; - } - - /* Create the service browser. */ - size = sizeof("_._tcp") + strlen(service); /* includes room for the nul */ - if ((serviceTag = malloc(size)) == NULL) { - context.error = ENOMEM; - goto done; - } - pmsprintf(serviceTag, size, "_%s._tcp", service); - sb = avahi_service_browser_new(ac, AVAHI_IF_UNSPEC, - AVAHI_PROTO_UNSPEC, serviceTag, - NULL, (AvahiLookupFlags)0, - browseCallback, & context); - free(serviceTag); - if (sb == NULL) { - context.error = ENOMEM; - goto done; - } - - /* Extract any ,timeout=NNN parameters. */ - timeout = discoveryTimeout(); /* default */ - - timeoutBegin = strstr(mechanism ? mechanism : "", ",timeout="); - if (timeoutBegin) { - timeoutBegin += strlen(",timeout="); /* skip over it */ - timeout = strtod (timeoutBegin, & timeoutEnd); - if ((*timeoutEnd != '\0' && *timeoutEnd != ',') || (timeout < 0.0)) { - pmNotifyErr(LOG_WARNING, - "ignored bad avahi timeout = '%*s'\n", - (int)(timeoutEnd-timeoutBegin), timeoutBegin); - timeout = discoveryTimeout(); - } - } - - /* Set the timeout. */ - avahi_simple_poll_get(simplePoll)->timeout_new( - avahi_simple_poll_get(simplePoll), - avahi_elapse_time(&tv, (unsigned)(timeout * 1000), 0), - timeoutCallback, &context); - - /* - * This loop is based on the one in avahi_simple_poll_loop(). - * - * Run the main loop one iteration at a time until it times out - * or until we are interrupted. - * The overall timeout within simplePoll will be respected and - * avahi_simple_poll_iterate() will return 1 if it occurs. - * Otherwise, avahi_simple_poll_iterate() returns -1 on error and - * zero on success. - * The discovered services will be added to 'urls' during the call back - * to resolveCallback - */ - while (! options->timedOut && - (! options->flags || - (*options->flags & PM_SERVICE_DISCOVERY_INTERRUPTED) == 0)) { - if ((sts = avahi_simple_poll_iterate(simplePoll, -1)) != 0) - if (sts > 0 || errno != EINTR) - break; - } - numUrls = context.numUrls; - - done: - /* Cleanup. */ - if (ac) { - /* Also frees the service browser. */ - avahi_client_free(ac); - } - if (simplePoll) - avahi_simple_poll_free(simplePoll); - - /* - * Check to see if there was an error. Make sure that the returned error - * code is negative. - */ - if (context.error) - return -context.error; - - return numUrls; -} diff --git a/src/libpcp/src/avahi.h b/src/libpcp/src/avahi.h deleted file mode 100644 index 9f7c2fcc493..00000000000 --- a/src/libpcp/src/avahi.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2013-2014 Red Hat. - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - */ -#ifndef AVAHI_H -#define AVAHI_H - -#ifdef HAVE_AVAHI -void __pmServerAvahiAdvertisePresence(__pmServerPresence *) _PCP_HIDDEN; -void __pmServerAvahiUnadvertisePresence(__pmServerPresence *) _PCP_HIDDEN; -int __pmAvahiDiscoverServices(const char *, - const char *, - const __pmServiceDiscoveryOptions *, - int, - char ***) _PCP_HIDDEN; -#else -#define __pmServerAvahiAdvertisePresence(p) do { } while (0) -#define __pmServerAvahiUnadvertisePresence(p) do { } while (0) -#define __pmAvahiDiscoverServices(s, m, o, n, u) 0 -#endif - -#endif /* AVAHI_H */ diff --git a/src/libpcp/src/check-statics b/src/libpcp/src/check-statics index e7aeefbd94e..15ad4c1c98c 100755 --- a/src/libpcp/src/check-statics +++ b/src/libpcp/src/check-statics @@ -212,16 +212,6 @@ auxserver.o localSocketFd # single-threaded server scope server_features # single-threaded server scope discovery.o -?avahi.o - nActiveServices # single-threaded server scope - szActiveServices # single-threaded server scope - activeServices # single-threaded server scope - threadedPoll # single-threaded server scope - simplePoll # single-threaded server scope - client # single-threaded server scope - group # single-threaded server scope - done_default # guarded by __pmLock_extcall mutex - def_timeout # guarded by __pmLock_extcall mutex config.o ?__pmNativeConfig # const config_lock # local mutex diff --git a/src/libpcp/src/discovery.c b/src/libpcp/src/discovery.c index 561457fb850..945e61658c7 100644 --- a/src/libpcp/src/discovery.c +++ b/src/libpcp/src/discovery.c @@ -14,7 +14,6 @@ #include "pmapi.h" #include "libpcp.h" #include "internal.h" -#include "avahi.h" #include "shellprobe.h" #include "subnetprobe.h" @@ -38,9 +37,8 @@ __pmServerAdvertisePresence(const char *serviceSpec, int port) /* Now advertise our presence using all available means. If a particular * method is not available or not configured, then the respective call - * will have no effect. Currently, only Avahi is supported. + * will have no effect. */ - __pmServerAvahiAdvertisePresence(s); return s; } @@ -55,7 +53,6 @@ __pmServerUnadvertisePresence(__pmServerPresence *s) /* Unadvertise our presence for all available means. If a particular * method is not active, then the respective call will have no effect. */ - __pmServerAvahiUnadvertisePresence(s); free(s->serviceSpec); free(s); } @@ -239,13 +236,6 @@ __pmDiscoverServicesWithOptions(const char *service, * Ensure that the return value from each mechanism is not an error * code before adding it to numUrls. */ - sts = __pmAvahiDiscoverServices(service, mechanism, &options, - numUrls, urls); - if (sts < 0) { - numUrls = sts; - goto done; - } - numUrls += sts; if (! flags || (*flags & PM_SERVICE_DISCOVERY_INTERRUPTED) == 0) { sts = __pmSubnetProbeDiscoverServices(service, mechanism, &options, numUrls, urls); @@ -265,10 +255,6 @@ __pmDiscoverServicesWithOptions(const char *service, numUrls += sts; } } - else if (strncmp(mechanism, "avahi", sizeof("avahi")-1) == 0) { - numUrls = __pmAvahiDiscoverServices(service, mechanism, &options, - numUrls, urls); - } else if (strncmp(mechanism, "probe", sizeof("probe")-1) == 0) { numUrls = __pmSubnetProbeDiscoverServices(service, mechanism, &options, numUrls, urls); diff --git a/src/libpcp/src/internal.h b/src/libpcp/src/internal.h index 4a647205ea4..5a5ec06fa55 100644 --- a/src/libpcp/src/internal.h +++ b/src/libpcp/src/internal.h @@ -290,14 +290,9 @@ extern char *__pmStringListFind(const char *, int, char **) _PCP_HIDDEN; /* * Representations of server presence on the network. */ -typedef struct __pmServerAvahiPresence __pmServerAvahiPresence; - struct __pmServerPresence { - /* Common data. */ - char *serviceSpec; - int port; - /* API-specific data. */ - __pmServerAvahiPresence *avahi; + char *serviceSpec; + int port; }; /* Service discovery internals. */ diff --git a/src/libpcp3/src/GNUlibrarydefs b/src/libpcp3/src/GNUlibrarydefs index 519124eb16a..c5bcac9ab4b 100644 --- a/src/libpcp3/src/GNUlibrarydefs +++ b/src/libpcp3/src/GNUlibrarydefs @@ -8,11 +8,6 @@ LIBPCP_LDLIBS += $(LIB_FOR_OPENSSL) $(LIB_FOR_LIBSASL2) LIBPCP_CFLAGS += $(OPENSSLCFLAGS) $(SASLCFLAGS) endif -ifeq "$(ENABLE_AVAHI)" "true" -LIBPCP_LDLIBS += $(LIB_FOR_AVAHI) -LIBPCP_CFLAGS += $(AVAHICFLAGS) -endif - ifeq "$(ENABLE_LZMA)" "true" LIBPCP_LDLIBS += $(LIB_FOR_LZMA) LIBPCP_CFLAGS += $(LZMACFLAGS) diff --git a/src/libpcp3/src/GNUmakefile b/src/libpcp3/src/GNUmakefile index 328439a2231..0c27f67d264 100644 --- a/src/libpcp3/src/GNUmakefile +++ b/src/libpcp3/src/GNUmakefile @@ -46,7 +46,7 @@ CFILES = connect.c context.c desc.c err.c fetch.c fetchgroup.c result.c \ e_loglabel.c e_index.c e_indom.c e_labels.c throttle.c \ $(JSONSL_CFILES) HFILES = derive.h internal.h compiler.h pmdbg.h sha256.h sort_r.h \ - avahi.h subnetprobe.h shellprobe.h \ + subnetprobe.h shellprobe.h \ $(JSONSL_HFILES) XFILES = sha256.c sha256.h sort_r.h YFILES = getdate.y derive_parser.y @@ -63,10 +63,6 @@ ifeq "$(ENABLE_SECURE)" "true" CFILES += secureserver.c secureconnect.c endif -ifeq "$(ENABLE_AVAHI)" "true" -CFILES += avahi.c -endif - ifeq "$(ENABLE_LZMA)" "true" CFILES += io_xz.c endif diff --git a/src/libpcp3/src/avahi.c b/src/libpcp3/src/avahi.c deleted file mode 100644 index 06b75ffe635..00000000000 --- a/src/libpcp3/src/avahi.c +++ /dev/null @@ -1,806 +0,0 @@ -/* - * Copyright (c) 2013-2015,2019-2020 Red Hat. - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pmapi.h" -#include "libpcp.h" -#include "internal.h" -#include "avahi.h" - -/* Support for servers advertising their presence. */ -static AvahiThreadedPoll *threadedPoll; -static AvahiClient *client; -static AvahiEntryGroup *group; - -static __pmServerPresence **activeServices; -static int nActiveServices; -static int szActiveServices; - -struct __pmServerAvahiPresence { - char *serviceName; - char *serviceTag; - int collisions; -}; - -static void entryGroupCallback(AvahiEntryGroup *, AvahiEntryGroupState, void *); - -static int -renameService(__pmServerPresence *s) -{ - /* - * Each service must have a unique name on the local network. - * When there is a collision, we try to rename the service. - * However, we need to limit the number of attempts, since the - * service namespace could be maliciously flooded with service - * names designed to maximize collisions. - * Arbitrarily choose a limit of 65535, which is the number of - * TCP ports. - */ - ++s->avahi->collisions; - if (s->avahi->collisions >= 65535) { - pmNotifyErr(LOG_ERR, "Too many service name collisions for Avahi service %s", - s->avahi->serviceTag); - return -EBUSY; - } - - /* - * Use the avahi-supplied function to generate a new service name. - */ - char *n = avahi_alternative_service_name(s->avahi->serviceName); - - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Avahi service name collision, renaming service '%s' to '%s'", - s->avahi->serviceName, n); - avahi_free(s->avahi->serviceName); - s->avahi->serviceName = n; - - return 0; -} - -static int -renameServices(void) -{ - int i; - int rc = 0; - __pmServerPresence *s; - - for (i = 0; i < szActiveServices; ++i) { - s = activeServices[i]; - if (s == NULL) - continue; /* empty entry */ - if ((rc = renameService(s)) < 0) - break; - } - - return rc; -} - -static void -createServices(AvahiClient *c) -{ - __pmServerPresence *s; - int ret; - int i; - - /* - * Create a new entry group, if necessary, or reset the existing one. - */ - if (group == NULL) { - if ((group = avahi_entry_group_new(c, entryGroupCallback, NULL)) == NULL) { - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_ERR, "avahi_entry_group_new failed: %s", - avahi_strerror(avahi_client_errno(c))); - return; - } - } - else - avahi_entry_group_reset(group); - - /* - * We will now add our services to the entry group. - */ - for (i = 0; i < szActiveServices; ++i) { - s = activeServices[i]; - if (s == NULL) - continue; /* empty table entry */ - - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Adding %s Avahi service on port %d", - s->avahi->serviceName, s->port); - - /* Loop until no collisions */ - for (;;) { - ret = avahi_entry_group_add_service(group, AVAHI_IF_UNSPEC, - AVAHI_PROTO_UNSPEC, - (AvahiPublishFlags)0, - s->avahi->serviceName, - s->avahi->serviceTag, - NULL, NULL, s->port, NULL); - if (ret == AVAHI_OK) - break; /* success! */ - if (ret == AVAHI_ERR_COLLISION) { - /* - * A service name collision with a local service happened. - * Pick a new name. Since a service may be listening on - * multiple ports, this is expected to happen sometimes - - * do not issue warnings here. - */ - if (renameService(s) < 0) { - /* Too many collisions. Message already issued */ - goto fail; - } - continue; /* try again */ - } - - pmNotifyErr(LOG_ERR, "Failed to add %s Avahi service on port %d: %s", - s->avahi->serviceName, s->port, avahi_strerror(ret)); - goto fail; - } - } - - /* Tell the server to register the services. */ - if ((ret = avahi_entry_group_commit(group)) < 0) { - pmNotifyErr(LOG_ERR, "Failed to commit avahi entry group: %s", - avahi_strerror(ret)); - goto fail; - } - - return; - - fail: - avahi_entry_group_reset(group); -} - -static void -entryGroupCallback(AvahiEntryGroup *g, AvahiEntryGroupState state, void *data) -{ - (void)data; - - assert(group == NULL || group == g); - group = g; - - /* Called whenever the entry group state changes. */ - switch (state) { - case AVAHI_ENTRY_GROUP_ESTABLISHED: - /* The entry group has been established successfully. */ - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Avahi services successfully established."); - break; - - case AVAHI_ENTRY_GROUP_COLLISION: - /* - * A service name collision with a remote service happened. - * Unfortunately, we don't know which entry collided. - * We need to rename them all and recreate the services. - */ - if (renameServices() == 0) - createServices(avahi_entry_group_get_client(g)); - break; - - case AVAHI_ENTRY_GROUP_FAILURE: - /* Some kind of failure happened. */ - pmNotifyErr(LOG_ERR, "Avahi entry group failure: %s", - avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g)))); - break; - - case AVAHI_ENTRY_GROUP_UNCOMMITED: - case AVAHI_ENTRY_GROUP_REGISTERING: - break; - } -} - -static void -cleanupClient(void) -{ - /* This also frees the entry group, if any. */ - if (client) { - avahi_client_free(client); - client = NULL; - group = NULL; - } -} - -static void -advertisingClientCallback(AvahiClient *c, AvahiClientState state, void *userData) -{ - (void)userData; - - /* Called whenever the client or server state changes. */ - switch (state) { - case AVAHI_CLIENT_S_RUNNING: - /* - * The server has started successfully and registered its host - * name on the network, so it's time to create our services. - */ - createServices(c); - break; - - case AVAHI_CLIENT_FAILURE: - pmNotifyErr(LOG_ERR, "Avahi client failure: %s", - avahi_strerror(avahi_client_errno(c))); - if (avahi_client_errno (c) == AVAHI_ERR_DISCONNECTED) { - int error; - /* - * The client has been disconnected; probably because the - * avahi daemon has been restarted. We can free the client - * here and try to reconnect using a new one. - * Passing AVAHI_CLIENT_NO_FAIL allows the new client to be - * created, even if the avahi daemon is not running. Our - * service will be advertised if/when the daemon is started. - */ - cleanupClient(); - client = avahi_client_new(avahi_threaded_poll_get(threadedPoll), - (AvahiClientFlags)AVAHI_CLIENT_NO_FAIL, - advertisingClientCallback, NULL, & error); - } - break; - - case AVAHI_CLIENT_S_COLLISION: - /* - * Drop our registered services. When the server is back - * in AVAHI_SERVER_RUNNING state we will register them - * again with the new host name. - * Fall through ... - */ - case AVAHI_CLIENT_S_REGISTERING: - /* - * The server records are now being established. This - * might be caused by a host name change. We need to wait - * for our own records to register until the host name is - * properly esatblished. - */ - if (group) - avahi_entry_group_reset (group); - break; - - case AVAHI_CLIENT_CONNECTING: - /* - * The avahi-daemon is not currently running. Our service will be - * advertised if/when the daemon is started. - */ - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, - "The Avahi daemon is not running. " - "Avahi services will be established when the daemon is started"); - break; - } -} - -static void -cleanup(__pmServerAvahiPresence *s) -{ - if (s == NULL) - return; - - if (s->serviceName) { - avahi_free(s->serviceName); - s->serviceName = NULL; - } - if (s->serviceTag) { - avahi_free(s->serviceTag); - s->serviceTag = NULL; - } -} - -/* Add a new serice to the active services list. */ -static void -addService(__pmServerPresence *s) -{ - int i; - size_t size; - - /* Find an empty slot in the table of active services. */ - for (i = 0; i < szActiveServices; ++i) { - if (activeServices[i] == NULL) - break; - } - - /* Do we need to grow the table? */ - if (i >= szActiveServices) { - ++szActiveServices; - size = szActiveServices * sizeof(*activeServices); - activeServices = realloc(activeServices, size); - if (activeServices == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate service table", - size, PM_FATAL_ERR); - } - } - - /* Add the service to the table. */ - activeServices[i] = s; - ++nActiveServices; -} - -/* Remove a service from the active services list. */ -static void -removeService(__pmServerPresence *s) -{ - int i; - - /* - * Find the service in the table of active services. - * We can do this by comparing the pointers directly, since - * that's how the services were added. - */ - for (i = 0; i < szActiveServices; ++i) { - /* - * Did we find it? If so, clear the entry. - * We don't free it here. - */ - if (activeServices[i] == s) { - activeServices[i] = NULL; - --nActiveServices; - return; - } - } -} - -/* Publish a new service. */ -static void -publishService(__pmServerPresence *s) -{ - int error; - - /* Add the service to our list of active services. */ - addService(s); - - /* Is this the first service to be added? */ - if (threadedPoll == NULL) { - /* Allocate main loop object. */ - if ((threadedPoll = avahi_threaded_poll_new()) == NULL) { - pmNotifyErr(LOG_ERR, "Failed to create avahi threaded poll object."); - goto fail; - } - - /* - * Always allocate a new client. Passing AVAHI_CLIENT_NO_FAIL allows - * the client to be created, even if the avahi daemon is not running. - * Our service will be advertised if/when the daemon is started. - */ - client = avahi_client_new(avahi_threaded_poll_get(threadedPoll), - (AvahiClientFlags)AVAHI_CLIENT_NO_FAIL, - advertisingClientCallback, NULL, &error); - - /* Check whether creating the client object succeeded. */ - if (! client) { - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_WARNING, "Failed to create avahi client: %s", - avahi_strerror(error)); - goto fail; - } - - /* Start the main loop. */ - avahi_threaded_poll_start(threadedPoll); - } - else { - /* Stop the main loop while we recreate the services. */ - avahi_threaded_poll_lock(threadedPoll); - createServices(client); - avahi_threaded_poll_unlock(threadedPoll); - } - - return; - - fail: - removeService(s); - cleanup(s->avahi); - free(s->avahi); - s->avahi = NULL; -} - -void -__pmServerAvahiAdvertisePresence(__pmServerPresence *s) -{ - size_t size; - char host[MAXHOSTNAMELEN]; - - /* Allocate the avahi server presence. */ - s->avahi = malloc(sizeof(*s->avahi)); - if (s->avahi == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate avahi service data", - sizeof(*s->avahi), PM_FATAL_ERR); - } - - /* - * The service spec is simply the name of the server. Use it to - * construct the avahi service name and service tag. - * The service name cannot be longer than AVAHI_LABEL_MAX - 1. - */ - gethostname(host, sizeof(host)); - host[sizeof(host)-1] = '\0'; - - size = sizeof("PCP..on.") + strlen(host) + - strlen(s->serviceSpec); /* includes room for the nul */ - if (size > AVAHI_LABEL_MAX) - size = AVAHI_LABEL_MAX; - if ((s->avahi->serviceName = avahi_malloc(size)) == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate service name", - size, PM_FATAL_ERR); - } - pmsprintf(s->avahi->serviceName, size, "PCP %s on %s", s->serviceSpec, host); - assert(avahi_is_valid_service_name(s->avahi->serviceName)); - - size = sizeof("_._tcp") + strlen(s->serviceSpec); /* includes room for the nul */ - if ((s->avahi->serviceTag = avahi_malloc(size)) == NULL) { - pmNoMem("__pmServerAvahiAdvertisePresence: can't allocate service tag", - size, PM_FATAL_ERR); - } - pmsprintf(s->avahi->serviceTag, size, "_%s._tcp", s->serviceSpec); - s->avahi->collisions = 0; - - /* Now publish the avahi service. */ - publishService(s); -} - -void -__pmServerAvahiUnadvertisePresence(__pmServerPresence *s) -{ - /* Not an avahi service? */ - if (s->avahi == NULL) - return; - - if (pmDebugOptions.discovery) - pmNotifyErr(LOG_INFO, "Removing Avahi service '%s' on port %d", - s->avahi->serviceName , s->port); - - /* Remove and cleanup the service. */ - removeService(s); - cleanup(s->avahi); - free(s->avahi); - s->avahi = NULL; - - /* Nothing to do if the client is not running. */ - if (threadedPoll == NULL) - return; - - /* Stop the main loop. */ - - /* If no services remain, then shut down the avahi client. */ - if (nActiveServices == 0) { - /* Clean up the avahi objects. The order of freeing these is significant. */ - avahi_threaded_poll_stop(threadedPoll); - cleanupClient(); - avahi_threaded_poll_free(threadedPoll); - threadedPoll = NULL; - return; - } - - /* Otherwise, stop the main loop while we recreate the services. */ - avahi_threaded_poll_lock(threadedPoll); - createServices(client); - avahi_threaded_poll_unlock(threadedPoll); -} - -/* Support for clients searching for services. */ -typedef struct browsingContext { - const __pmServiceDiscoveryOptions *discoveryOptions; - AvahiSimplePoll *simplePoll; - char ***urls; - int numUrls; - int error; -} browsingContext; - -/* Called whenever a service has been resolved successfully or timed out. */ -static void -resolveCallback( - AvahiServiceResolver *r, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiResolverEvent event, - const char *name, - const char *type, - const char *domain, - const char *hostName, - const AvahiAddress *address, - uint16_t port, - AvahiStringList *txt, - AvahiLookupResultFlags flags, - void *userdata -) -{ - char addressString[AVAHI_ADDRESS_STR_MAX]; - browsingContext *context = (browsingContext *)userdata; - char ***urls = context->urls; - int numUrls = context->numUrls; - __pmServiceInfo serviceInfo; - - /* Unused arguments. */ - (void)protocol; - (void)hostName; - (void)txt; - (void)flags; - - switch (event) { - case AVAHI_RESOLVER_FAILURE: - context->error = EOPNOTSUPP; - break; - - case AVAHI_RESOLVER_FOUND: - if (strcmp(type, "_" PM_SERVER_SERVICE_SPEC "._tcp") == 0) { - serviceInfo.spec = PM_SERVER_SERVICE_SPEC; - serviceInfo.protocol = SERVER_PROTOCOL; - } - else if (strcmp(type, "_" PM_SERVER_PROXY_SPEC "._tcp") == 0) { - serviceInfo.spec = PM_SERVER_PROXY_SPEC; - serviceInfo.protocol = PROXY_PROTOCOL; - } - else if (strcmp(type, "_" PM_SERVER_WEBAPI_SPEC "._tcp") == 0) { - serviceInfo.spec = PM_SERVER_WEBAPI_SPEC; - serviceInfo.protocol = WEBAPI_PROTOCOL; - } - else { - context->error = EINVAL; - break; - } - - avahi_address_snprint(addressString, sizeof(addressString), address); - serviceInfo.address = __pmStringToSockAddr(addressString); - if (serviceInfo.address == NULL) { - context->error = ENOMEM; - break; - } - __pmSockAddrSetPort(serviceInfo.address, port); - __pmSockAddrSetScope(serviceInfo.address, interface); - context->numUrls = __pmAddDiscoveredService(&serviceInfo, - context->discoveryOptions, - numUrls, urls); - __pmSockAddrFree(serviceInfo.address); - break; - - default: - break; - } - - avahi_service_resolver_free(r); -} - -/* - * Called whenever a new service becomes available on the LAN - * or is removed from the LAN. - */ -static void -browseCallback( - AvahiServiceBrowser *b, - AvahiIfIndex interface, - AvahiProtocol protocol, - AvahiBrowserEvent event, - const char *name, - const char *type, - const char *domain, - AvahiLookupResultFlags flags, - void *userdata -) -{ - browsingContext *context = (browsingContext *)userdata; - AvahiClient *c = avahi_service_browser_get_client(b); - AvahiSimplePoll *simplePoll = context->simplePoll; - - /* Unused argument. */ - (void)flags; - - switch (event) { - case AVAHI_BROWSER_FAILURE: - context->error = EOPNOTSUPP; - avahi_simple_poll_quit(simplePoll); - break; - - case AVAHI_BROWSER_NEW: - /* - * We ignore the returned resolver object. In the callback - * function we free it. If the server is terminated before - * the callback function is called the server will free - * the resolver for us. - */ - if (!(avahi_service_resolver_new(c, interface, protocol, - name, type, domain, - AVAHI_PROTO_UNSPEC, (AvahiLookupFlags)0, - resolveCallback, context))) { - context->error = EOPNOTSUPP; - } - break; - - case AVAHI_BROWSER_REMOVE: - case AVAHI_BROWSER_ALL_FOR_NOW: - case AVAHI_BROWSER_CACHE_EXHAUSTED: - break; - } -} - -/* Called whenever the client or server state changes. */ -static void -browsingClientCallback(AvahiClient *c, AvahiClientState state, void *userdata) -{ - if (state == AVAHI_CLIENT_FAILURE) { - browsingContext *context = (browsingContext *)userdata; - AvahiSimplePoll *simplePoll = context->simplePoll; - context->error = EOPNOTSUPP; - avahi_simple_poll_quit(simplePoll); - } -} - -static void -timeoutCallback(AvahiTimeout *e, void *userdata) -{ - browsingContext *context = (browsingContext *)userdata; - AvahiSimplePoll *simplePoll = context->simplePoll; - (void)e; - avahi_simple_poll_quit(simplePoll); -} - - -static double -discoveryTimeout(void) -{ - static int done_default = 0; - static double def_timeout = 0.5; /* 0.5 seconds */ - - PM_LOCK(__pmLock_extcall); - if (!done_default) { - char *timeout_str; - char *end_ptr; - double new_timeout; - done_default = 1; - timeout_str = getenv("AVAHI_DISCOVERY_TIMEOUT"); /* THREADSAFE */ - if (timeout_str != NULL) { - new_timeout = strtod(timeout_str, &end_ptr); - if (*end_ptr != '\0' || def_timeout < 0.0) { - char *fromenv = strdup(timeout_str); - PM_UNLOCK(__pmLock_extcall); - pmNotifyErr(LOG_WARNING, - "ignored bad AVAHI_DISCOVERY_TIMEOUT = '%s'\n", - fromenv); - } - else { - def_timeout = new_timeout; - PM_UNLOCK(__pmLock_extcall); - } - } - else - PM_UNLOCK(__pmLock_extcall); - } - else - PM_UNLOCK(__pmLock_extcall); - - return def_timeout; -} - -int -__pmAvahiDiscoverServices(const char *service, - const char *mechanism, - const __pmServiceDiscoveryOptions *options, - int numUrls, - char ***urls) -{ - AvahiClient *ac = NULL; - AvahiServiceBrowser *sb = NULL; - AvahiSimplePoll *simplePoll; - struct timeval tv; - browsingContext context; - char *serviceTag; - size_t size; - const char *timeoutBegin; - char *timeoutEnd; - double timeout; - int sts; - - /* Allocate the main loop object. */ - if (!(simplePoll = avahi_simple_poll_new())) - return -ENOMEM; - - context.discoveryOptions = options; - context.error = 0; - context.simplePoll = simplePoll; - context.urls = urls; - context.numUrls = numUrls; - - /* Allocate a new Avahi client */ - ac = avahi_client_new(avahi_simple_poll_get(simplePoll), - (AvahiClientFlags)0, - browsingClientCallback, &context, &context.error); - - /* Check whether creating the client object succeeded. */ - if (!ac) { - /* Avahi error codes are negative, and are of no use to the caller. */ - if (context.error < 0) - context.error = EOPNOTSUPP; - goto done; - } - - /* Create the service browser. */ - size = sizeof("_._tcp") + strlen(service); /* includes room for the nul */ - if ((serviceTag = malloc(size)) == NULL) { - context.error = ENOMEM; - goto done; - } - pmsprintf(serviceTag, size, "_%s._tcp", service); - sb = avahi_service_browser_new(ac, AVAHI_IF_UNSPEC, - AVAHI_PROTO_UNSPEC, serviceTag, - NULL, (AvahiLookupFlags)0, - browseCallback, & context); - free(serviceTag); - if (sb == NULL) { - context.error = ENOMEM; - goto done; - } - - /* Extract any ,timeout=NNN parameters. */ - timeout = discoveryTimeout(); /* default */ - - timeoutBegin = strstr(mechanism ? mechanism : "", ",timeout="); - if (timeoutBegin) { - timeoutBegin += strlen(",timeout="); /* skip over it */ - timeout = strtod (timeoutBegin, & timeoutEnd); - if ((*timeoutEnd != '\0' && *timeoutEnd != ',') || (timeout < 0.0)) { - pmNotifyErr(LOG_WARNING, - "ignored bad avahi timeout = '%*s'\n", - (int)(timeoutEnd-timeoutBegin), timeoutBegin); - timeout = discoveryTimeout(); - } - } - - /* Set the timeout. */ - avahi_simple_poll_get(simplePoll)->timeout_new( - avahi_simple_poll_get(simplePoll), - avahi_elapse_time(&tv, (unsigned)(timeout * 1000), 0), - timeoutCallback, &context); - - /* - * This loop is based on the one in avahi_simple_poll_loop(). - * - * Run the main loop one iteration at a time until it times out - * or until we are interrupted. - * The overall timeout within simplePoll will be respected and - * avahi_simple_poll_iterate() will return 1 if it occurs. - * Otherwise, avahi_simple_poll_iterate() returns -1 on error and - * zero on success. - * The discovered services will be added to 'urls' during the call back - * to resolveCallback - */ - while (! options->timedOut && - (! options->flags || - (*options->flags & PM_SERVICE_DISCOVERY_INTERRUPTED) == 0)) { - if ((sts = avahi_simple_poll_iterate(simplePoll, -1)) != 0) - if (sts > 0 || errno != EINTR) - break; - } - numUrls = context.numUrls; - - done: - /* Cleanup. */ - if (ac) { - /* Also frees the service browser. */ - avahi_client_free(ac); - } - if (simplePoll) - avahi_simple_poll_free(simplePoll); - - /* - * Check to see if there was an error. Make sure that the returned error - * code is negative. - */ - if (context.error) - return -context.error; - - return numUrls; -} diff --git a/src/libpcp3/src/avahi.h b/src/libpcp3/src/avahi.h deleted file mode 100644 index 9f7c2fcc493..00000000000 --- a/src/libpcp3/src/avahi.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2013-2014 Red Hat. - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public - * License for more details. - */ -#ifndef AVAHI_H -#define AVAHI_H - -#ifdef HAVE_AVAHI -void __pmServerAvahiAdvertisePresence(__pmServerPresence *) _PCP_HIDDEN; -void __pmServerAvahiUnadvertisePresence(__pmServerPresence *) _PCP_HIDDEN; -int __pmAvahiDiscoverServices(const char *, - const char *, - const __pmServiceDiscoveryOptions *, - int, - char ***) _PCP_HIDDEN; -#else -#define __pmServerAvahiAdvertisePresence(p) do { } while (0) -#define __pmServerAvahiUnadvertisePresence(p) do { } while (0) -#define __pmAvahiDiscoverServices(s, m, o, n, u) 0 -#endif - -#endif /* AVAHI_H */ diff --git a/src/libpcp3/src/check-statics b/src/libpcp3/src/check-statics index 4985028faa3..ec1f52632ff 100755 --- a/src/libpcp3/src/check-statics +++ b/src/libpcp3/src/check-statics @@ -212,16 +212,6 @@ auxserver.o localSocketFd # single-threaded server scope server_features # single-threaded server scope discovery.o -?avahi.o - nActiveServices # single-threaded server scope - szActiveServices # single-threaded server scope - activeServices # single-threaded server scope - threadedPoll # single-threaded server scope - simplePoll # single-threaded server scope - client # single-threaded server scope - group # single-threaded server scope - done_default # guarded by __pmLock_extcall mutex - def_timeout # guarded by __pmLock_extcall mutex config.o ?__pmNativeConfig # const config_lock # local mutex diff --git a/src/libpcp3/src/discovery.c b/src/libpcp3/src/discovery.c index 561457fb850..945e61658c7 100644 --- a/src/libpcp3/src/discovery.c +++ b/src/libpcp3/src/discovery.c @@ -14,7 +14,6 @@ #include "pmapi.h" #include "libpcp.h" #include "internal.h" -#include "avahi.h" #include "shellprobe.h" #include "subnetprobe.h" @@ -38,9 +37,8 @@ __pmServerAdvertisePresence(const char *serviceSpec, int port) /* Now advertise our presence using all available means. If a particular * method is not available or not configured, then the respective call - * will have no effect. Currently, only Avahi is supported. + * will have no effect. */ - __pmServerAvahiAdvertisePresence(s); return s; } @@ -55,7 +53,6 @@ __pmServerUnadvertisePresence(__pmServerPresence *s) /* Unadvertise our presence for all available means. If a particular * method is not active, then the respective call will have no effect. */ - __pmServerAvahiUnadvertisePresence(s); free(s->serviceSpec); free(s); } @@ -239,13 +236,6 @@ __pmDiscoverServicesWithOptions(const char *service, * Ensure that the return value from each mechanism is not an error * code before adding it to numUrls. */ - sts = __pmAvahiDiscoverServices(service, mechanism, &options, - numUrls, urls); - if (sts < 0) { - numUrls = sts; - goto done; - } - numUrls += sts; if (! flags || (*flags & PM_SERVICE_DISCOVERY_INTERRUPTED) == 0) { sts = __pmSubnetProbeDiscoverServices(service, mechanism, &options, numUrls, urls); @@ -265,10 +255,6 @@ __pmDiscoverServicesWithOptions(const char *service, numUrls += sts; } } - else if (strncmp(mechanism, "avahi", sizeof("avahi")-1) == 0) { - numUrls = __pmAvahiDiscoverServices(service, mechanism, &options, - numUrls, urls); - } else if (strncmp(mechanism, "probe", sizeof("probe")-1) == 0) { numUrls = __pmSubnetProbeDiscoverServices(service, mechanism, &options, numUrls, urls); diff --git a/src/libpcp3/src/include/pcp/config.h.in b/src/libpcp3/src/include/pcp/config.h.in index ec6719d482f..7bbb68f2186 100644 --- a/src/libpcp3/src/include/pcp/config.h.in +++ b/src/libpcp3/src/include/pcp/config.h.in @@ -17,15 +17,6 @@ /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT -/* Service discovery via Avahi */ -#undef HAVE_AVAHI - -/* Define to 1 if you have the header file. */ -#undef HAVE_AVAHI_CLIENT_PUBLISH_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_AVAHI_COMMON_ALTERNATIVE_H - /* Define to 1 if you have the `backtrace' function. */ #undef HAVE_BACKTRACE diff --git a/src/libpcp3/src/internal.h b/src/libpcp3/src/internal.h index 8fe152173a4..ef9380fa873 100644 --- a/src/libpcp3/src/internal.h +++ b/src/libpcp3/src/internal.h @@ -288,14 +288,10 @@ extern char *__pmStringListFind(const char *, int, char **) _PCP_HIDDEN; /* * Representations of server presence on the network. */ -typedef struct __pmServerAvahiPresence __pmServerAvahiPresence; - struct __pmServerPresence { /* Common data. */ - char *serviceSpec; - int port; - /* API-specific data. */ - __pmServerAvahiPresence *avahi; + char *serviceSpec; + int port; }; /* Service discovery internals. */ diff --git a/src/libpcp_fault/src/GNUmakefile b/src/libpcp_fault/src/GNUmakefile index a14bf5c3f44..56b5ae3cebc 100644 --- a/src/libpcp_fault/src/GNUmakefile +++ b/src/libpcp_fault/src/GNUmakefile @@ -40,7 +40,7 @@ CFILES = connect.c context.c desc.c err.c fetch.c fetchgroup.c result.c \ e_loglabel.c e_index.c e_indom.c e_labels.c throttle.c \ $(JSONSL_CFILES) HFILES = derive.h internal.h compiler.h pmdbg.h sha256.h sort_r.h \ - avahi.h subnetprobe.h shellprobe.h \ + subnetprobe.h shellprobe.h \ $(JSONSL_HFILES) XFILES = sha256.c sha256.h sort_r.h YFILES = getdate.y derive_parser.y @@ -65,10 +65,6 @@ ifeq "$(ENABLE_SECURE)" "true" CFILES += secureserver.c secureconnect.c endif -ifeq "$(ENABLE_AVAHI)" "true" -CFILES += avahi.c -endif - ifeq "$(ENABLE_LZMA)" "true" CFILES += io_xz.c endif diff --git a/src/libpcp_static/src/GNUmakefile b/src/libpcp_static/src/GNUmakefile index e4120cbbad1..919c953ff3d 100644 --- a/src/libpcp_static/src/GNUmakefile +++ b/src/libpcp_static/src/GNUmakefile @@ -40,7 +40,7 @@ CFILES = connect.c context.c desc.c err.c fetch.c fetchgroup.c result.c \ e_loglabel.c e_index.c e_indom.c e_labels.c throttle.c \ $(JSONSL_CFILES) HFILES = derive.h internal.h compiler.h pmdbg.h sha256.h sort_r.h \ - avahi.h subnetprobe.h shellprobe.h \ + subnetprobe.h shellprobe.h \ $(JSONSL_HFILES) XFILES = sha256.c sha256.h sort_r.h YFILES = getdate.y derive_parser.y @@ -61,10 +61,6 @@ ifeq "$(ENABLE_SECURE)" "true" CFILES += secureserver.c secureconnect.c endif -ifeq "$(ENABLE_AVAHI)" "true" -CFILES += avahi.c -endif - ifeq "$(ENABLE_LZMA)" "true" CFILES += io_xz.c endif diff --git a/src/pmcd/pmcd.service.in b/src/pmcd/pmcd.service.in index c7b6a894624..f9d2fb9a935 100644 --- a/src/pmcd/pmcd.service.in +++ b/src/pmcd/pmcd.service.in @@ -1,7 +1,7 @@ [Unit] Description=Performance Metrics Collector Daemon Documentation=man:pmcd(1) -After=network-online.target avahi-daemon.service +After=network-online.target Before=zabbix-agent.service [Service] diff --git a/src/pmfind/pmfind.c b/src/pmfind/pmfind.c index f3708eae832..75dda755317 100644 --- a/src/pmfind/pmfind.c +++ b/src/pmfind/pmfind.c @@ -72,7 +72,7 @@ static const char *services[] = { static pmLongOptions longopts[] = { PMAPI_OPTIONS_HEADER("Discovery options"), PMOPT_DEBUG, - { "mechanism", 1, 'm', "NAME", "set the discovery method to use [avahi|shell|probe=|all]" }, + { "mechanism", 1, 'm', "NAME", "set the discovery method to use [shell|probe=|all]" }, { "resolve", 0, 'r', 0, "resolve addresses" }, { "service", 1, 's', "NAME", "discover services [pmcd|pmproxy|all]" }, { "timeout", 1, 't', "N.N", "timeout in seconds" }, diff --git a/src/pmproxy/pmproxy.service.in b/src/pmproxy/pmproxy.service.in index 9ef7abc77dd..7c15929a25c 100644 --- a/src/pmproxy/pmproxy.service.in +++ b/src/pmproxy/pmproxy.service.in @@ -1,7 +1,7 @@ [Unit] Description=Proxy for Performance Metrics Collector Daemon Documentation=man:pmproxy(1) -After=network-online.target valkey.service redis.service avahi-daemon.service pmcd.service +After=network-online.target valkey.service redis.service pmcd.service BindsTo=pmproxy_check.timer pmproxy_daily.timer [Service] diff --git a/src/selinux/pcp.te b/src/selinux/pcp.te index 69ee2b29572..0aa512c834b 100644 --- a/src/selinux/pcp.te +++ b/src/selinux/pcp.te @@ -191,10 +191,6 @@ optional_policy(` optional_policy(` dbus_system_bus_client(pcp_pmcd_t) - - optional_policy(` - avahi_dbus_chat(pcp_pmcd_t) - ') ') optional_policy(` @@ -241,10 +237,6 @@ logging_send_syslog_msg(pcp_pmproxy_t) optional_policy(` dbus_system_bus_client(pcp_pmproxy_t) - - optional_policy(` - avahi_dbus_chat(pcp_pmproxy_t) - ') ') ######################################## diff --git a/src/zshrc/_pcp b/src/zshrc/_pcp index 787656934bc..069533c15d1 100644 --- a/src/zshrc/_pcp +++ b/src/zshrc/_pcp @@ -1087,9 +1087,6 @@ _pcp () { pmfind_mechs) if compset -P '*,'; then case "$IPREFIX" in - *avahi,) - _wanted timeout expl 'timeout' compadd -S = timeout && ret=0 - ;; *probe=*) local -a opts [[ $IPREFIX != *timeout* ]] && opts+=( timeout ) @@ -1099,7 +1096,7 @@ _pcp () { ;; esac else - _wanted mechanisms expl 'mechanism' compadd -S '' avahi probe= && ret=0 + _wanted mechanisms expl 'mechanism' compadd -S '' probe= && ret=0 fi ;; pmiostat_extopts) From 900452386191e5f058f944beaa4c5fd0a61d9bf3 Mon Sep 17 00:00:00 2001 From: Nathan Scott Date: Fri, 20 Mar 2026 11:35:13 +1100 Subject: [PATCH 22/31] qa: remake test output for new proc metrics, archive --- qa/022.out.linux | 4 ++++ qa/1069.out | 8 ++++---- qa/1222.out | 4 ++++ qa/974.out | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/qa/022.out.linux b/qa/022.out.linux index e6d62f94fb5..66e31425c97 100644 --- a/qa/022.out.linux +++ b/qa/022.out.linux @@ -72,6 +72,10 @@ proc.namespaces.pid proc.namespaces.sid proc.namespaces.tgid proc.nprocs +proc.numa_maps.heap +proc.numa_maps.hugepage +proc.numa_maps.private +proc.numa_maps.stack proc.psinfo.blocked proc.psinfo.blocked_s proc.psinfo.cgroups diff --git a/qa/1069.out b/qa/1069.out index 8f7c6d05a8c..0cccfad76d4 100644 --- a/qa/1069.out +++ b/qa/1069.out @@ -810,10 +810,10 @@ Incompatible metric sample.sysinfo (PM_ERR_TYPE Unknown or illegal metric type). 16:06:53 1.000 1000.016 archive: QAPATH/archives/numa - host: ssosharm-pcp-test-vm - timezone: UTC+0 - start: Wed Oct 8 03:06:06 2025 - end: Wed Oct 8 03:06:14 2025 + host: localhost.localdomain + timezone: UTC-4 + start: Tue Mar 10 08:35:53 2026 + end: Tue Mar 10 08:36:01 2026 metrics: 1 (1 instance) samples: 9 interval: 1.0 sec diff --git a/qa/1222.out b/qa/1222.out index c894a934782..a7f4708c58e 100644 --- a/qa/1222.out +++ b/qa/1222.out @@ -63,6 +63,10 @@ proc.memory.vmsize: >10 values proc.memory.vmstack: >10 values proc.memory.vmswap: >10 values proc.nprocs: 1 value +proc.numa_maps.heap: >10 values +proc.numa_maps.hugepage: >10 values +proc.numa_maps.private: >10 values +proc.numa_maps.stack: >10 values proc.psinfo.blocked: >10 values proc.psinfo.blocked_s: >10 values proc.psinfo.cguest_time: >10 values diff --git a/qa/974.out b/qa/974.out index 90bfb61565b..a73b7a1c0ff 100644 --- a/qa/974.out +++ b/qa/974.out @@ -458,6 +458,11 @@ proc.namespaces.envid Semantics: discrete Units: none Error: Metric not supported by this version of monitored application +proc.numa_maps.heap + Data Type: string InDom: 3.9 0xc00009 + Semantics: instant Units: none +No value(s) available! + proc.psinfo.blocked Data Type: 32-bit unsigned int InDom: 3.9 0xc00009 Semantics: discrete Units: none @@ -1178,6 +1183,11 @@ proc.namespaces.envid Semantics: discrete Units: none Error: Metric not supported by this version of monitored application +proc.numa_maps.heap + Data Type: string InDom: 3.9 0xc00009 + Semantics: instant Units: none +No value(s) available! + proc.psinfo.blocked Data Type: 32-bit unsigned int InDom: 3.9 0xc00009 Semantics: discrete Units: none @@ -1799,6 +1809,11 @@ proc.namespaces.envid Semantics: discrete Units: none Error: Metric not supported by this version of monitored application +proc.numa_maps.heap + Data Type: string InDom: 3.9 0xc00009 + Semantics: instant Units: none +No value(s) available! + proc.psinfo.blocked Data Type: 32-bit unsigned int InDom: 3.9 0xc00009 Semantics: discrete Units: none @@ -2040,6 +2055,11 @@ proc.namespaces.envid Semantics: discrete Units: none Error: Metric not supported by this version of monitored application +proc.numa_maps.heap + Data Type: string InDom: 3.9 0xc00009 + Semantics: instant Units: none +No value(s) available! + proc.psinfo.blocked Data Type: 32-bit unsigned int InDom: 3.9 0xc00009 Semantics: discrete Units: none @@ -2123,6 +2143,11 @@ proc.namespaces.envid Semantics: discrete Units: none Error: Metric not supported by this version of monitored application +proc.numa_maps.heap + Data Type: string InDom: 3.9 0xc00009 + Semantics: instant Units: none +No value(s) available! + proc.psinfo.blocked Data Type: 32-bit unsigned int InDom: 3.9 0xc00009 Semantics: discrete Units: none @@ -2392,6 +2417,11 @@ proc.namespaces.envid Semantics: discrete Units: none Error: Metric not supported by this version of monitored application +proc.numa_maps.heap + Data Type: string InDom: 3.9 0xc00009 + Semantics: instant Units: none +No value(s) available! + proc.psinfo.blocked Data Type: 32-bit unsigned int InDom: 3.9 0xc00009 Semantics: discrete Units: none @@ -2602,6 +2632,11 @@ proc.namespaces.envid Semantics: discrete Units: none Error: Metric not supported by this version of monitored application +proc.numa_maps.heap + Data Type: string InDom: 3.9 0xc00009 + Semantics: instant Units: none +No value(s) available! + proc.psinfo.blocked Data Type: 32-bit unsigned int InDom: 3.9 0xc00009 Semantics: discrete Units: none From 757c2a1e1c4b51ee3e304f6c3f3038e6030432f3 Mon Sep 17 00:00:00 2001 From: Sourav Sharma Date: Fri, 20 Mar 2026 06:08:07 +0000 Subject: [PATCH 23/31] Removes trailing comma from proc.numa_maps metric string values Signed-off-by : Sourav Sharma --- qa/743.out | 446 +++++++++++------------ qa/archives/pcp-numastat-8-node.0.xz | Bin 51760 -> 60504 bytes qa/archives/pcp-numastat-8-node.index.xz | Bin 240 -> 248 bytes qa/archives/pcp-numastat-8-node.meta.xz | Bin 33064 -> 35064 bytes src/pmdas/linux_proc/help | 8 +- src/pmdas/linux_proc/proc_pid.c | 3 +- 6 files changed, 229 insertions(+), 228 deletions(-) diff --git a/qa/743.out b/qa/743.out index ceada22c46b..f0f247956b9 100644 --- a/qa/743.out +++ b/qa/743.out @@ -120,15 +120,15 @@ Other_node : 0 1 node numastat output, at archive end, cmd width -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:34 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:45 NUMA memory allocation statistics (pages) node0 node1 node2 -Hit : 7778725 390933 1718591 +Hit : 4669939 351805 1070738 node3 node4 node5 -Hit : 1546998 269741 530654 +Hit : 4520443 364409 507527 node6 node7 -Hit : 1461771 282136 +Hit : 549698 1134258 node0 node1 node2 Miss : 0 0 0 node3 node4 node5 @@ -142,101 +142,101 @@ Foreign : 0 0 0 node6 node7 Foreign : 0 0 node0 node1 node2 -Interleave_hit : 26847 26813 26848 +Interleave_hit : 26761 26891 26754 node3 node4 node5 -Interleave_hit : 26817 26845 26815 +Interleave_hit : 26894 26753 26892 node6 node7 -Interleave_hit : 26841 26810 +Interleave_hit : 26758 26887 node0 node1 node2 -Local_node : 7555332 317817 1645685 +Local_node : 4529082 258046 995697 node3 node4 node5 -Local_node : 1474522 196934 475480 +Local_node : 4429452 271016 414199 node6 node7 -Local_node : 1257886 208813 +Local_node : 389125 1040575 node0 node1 node2 -Other_node : 223393 73116 72906 +Other_node : 140857 93759 75041 node3 node4 node5 -Other_node : 72476 72807 55174 +Other_node : 90991 93393 93328 node6 node7 -Other_node : 203885 73323 +Other_node : 160573 93683 4 node numastat output, at archive end, large env width -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:34 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:45 NUMA memory allocation statistics (pages) node0 node1 node2 node3 node4 node5 node6 node7 -Hit : 7778725 390933 1718591 1546998 269741 530654 1461771 282136 +Hit : 4669939 351805 1070738 4520443 364409 507527 549698 1134258 Miss : 0 0 0 0 0 0 0 0 Foreign : 0 0 0 0 0 0 0 0 -Interleave_hit : 26847 26813 26848 26817 26845 26815 26841 26810 -Local_node : 7555332 317817 1645685 1474522 196934 475480 1257886 208813 -Other_node : 223393 73116 72906 72476 72807 55174 203885 73323 +Interleave_hit : 26761 26891 26754 26894 26753 26892 26758 26887 +Local_node : 4529082 258046 995697 4429452 271016 414199 389125 1040575 +Other_node : 140857 93759 75041 90991 93393 93328 160573 93683 4 node meminfo and numastat output with option -mn, at archive end, large env width -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:34 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:45 Per-node system memory usage (KB) node0 node1 node2 node3 node4 node5 node6 node7 -Total : 395394544 396345396 396345396 396345396 396345396 396345396 396345396 396191872 -Free : 387723236 395335052 395301836 395340584 395489944 395342740 394823412 395314388 -Used : 7671308 1010344 1043560 1004812 855452 1002656 1521984 877484 -Active : 432604 236 22772 6520 8 240 3336 356 -Inactive : 3245732 116468 50588 75916 276 6628 81496 65420 -Active_anon : 2448 20 100 8 0 8 24 4 -Inactive_anon : 795080 82580 41396 9572 268 6256 40748 29864 -Active_file : 430156 216 22672 6512 8 232 3312 352 -Inactive_file : 2450652 33888 9192 66344 8 372 40748 35556 -Unevictable : 12948 0 0 0 0 0 0 0 -Mlocked : 12948 0 0 0 0 0 0 0 -Dirty : 1688 0 0 0 0 0 0 0 +Total : 395394544 396345396 396345396 396300724 396345396 396345396 396345396 396236536 +Free : 388456748 395405332 394499764 394744388 395377008 395260632 394758896 395201164 +Used : 6937796 940064 1845632 1556336 968388 1084764 1586500 1035372 +Active : 511784 168 60368 60940 796 488 268 3532 +Inactive : 2720748 41812 778196 312512 9880 48548 91680 45616 +Active_anon : 3080 20 180 116 16 8 12 0 +Inactive_anon : 452236 41588 227556 150884 9560 35752 74200 4880 +Active_file : 508704 148 60188 60824 780 480 256 3532 +Inactive_file : 2268512 224 550640 161628 320 12796 17480 40736 +Unevictable : 12932 0 0 0 0 0 0 0 +Mlocked : 12932 0 0 0 0 0 0 0 +Dirty : 0 0 0 852 0 0 0 0 Writeback : 0 0 0 0 0 0 0 0 -FilePages : 2910280 34160 32700 72928 28 616 44104 35928 -Mapped : 129092 31452 3492 64 0 56 0 19420 -Anonpages : 765648 74064 32500 9508 256 5852 40728 29664 -Shmem : 18708 56 836 72 12 12 44 20 -KernelStack : 14256 9636 9588 9476 10196 11072 9984 9472 -PageTables : 15152 892 332 264 4 216 132 368 +FilePages : 2806088 600 611824 222752 1160 13312 17760 44304 +Mapped : 114828 524 159804 18668 660 832 16452 512 +Anonpages : 427336 36236 210644 148764 8380 35108 58896 4844 +Shmem : 18152 228 996 212 60 36 24 36 +KernelStack : 13584 9744 12224 11268 9588 10692 9764 10176 +PageTables : 10456 456 3144 4064 112 224 764 112 NFS_Unstable : 0 0 0 0 0 0 0 0 Bounce : 0 0 0 0 0 0 0 0 WritebackTmp : 0 0 0 0 0 0 0 0 -Filehugepages : 8192 0 0 0 0 0 0 0 -Filepmdmapped : 8192 0 0 0 0 0 0 0 -Slab : 800568 93604 125544 152044 106200 152240 195792 86260 -SlabReclaimable : 414968 15728 30600 52008 14444 30800 33964 13936 -SlabUnreclaimable : 385600 77876 94944 100036 91756 121440 161828 72324 -Anonhugepages : 116736 45056 18432 8192 0 2048 2048 22528 +Filehugepages : 20480 0 10240 0 0 0 0 0 +Filepmdmapped : 16384 0 4096 0 0 0 0 0 +Slab : 674560 97184 182528 340772 107220 158252 152884 137208 +SlabReclaimable : 280840 14036 27252 191496 17032 58932 22748 24212 +SlabUnreclaimable : 393720 83148 155276 149276 90188 99320 130136 112996 +Anonhugepages : 141312 24576 102400 16384 2048 12288 36864 4096 Shmemhugepages : 0 0 0 0 0 0 0 0 Shmempmdmapped : 0 0 0 0 0 0 0 0 HugepagesTotal : 0 0 0 0 0 0 0 0 HugepagesFree : 0 0 0 0 0 0 0 0 HugepagesSurp : 0 0 0 0 0 0 0 0 SwapCached : 0 0 0 0 0 0 0 0 -Kreclaimable : 414968 15728 30600 52008 14444 30800 33964 13936 +Kreclaimable : 280840 14036 27252 191496 17032 58932 22748 24212 NUMA memory allocation statistics (pages) node0 node1 node2 node3 node4 node5 node6 node7 -Hit : 7778725 390933 1718591 1546998 269741 530654 1461771 282136 +Hit : 4669939 351805 1070738 4520443 364409 507527 549698 1134258 Miss : 0 0 0 0 0 0 0 0 Foreign : 0 0 0 0 0 0 0 0 -Interleave_hit : 26847 26813 26848 26817 26845 26815 26841 26810 -Local_node : 7555332 317817 1645685 1474522 196934 475480 1257886 208813 -Other_node : 223393 73116 72906 72476 72807 55174 203885 73323 +Interleave_hit : 26761 26891 26754 26894 26753 26892 26758 26887 +Local_node : 4529082 258046 995697 4429452 271016 414199 389125 1040575 +Other_node : 140857 93759 75041 90991 93393 93328 160573 93683 4 node numastat output, at archive end, small env width -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:34 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:45 NUMA memory allocation statistics (pages) node0 node1 -Hit : 7778725 390933 +Hit : 4669939 351805 node2 node3 -Hit : 1718591 1546998 +Hit : 1070738 4520443 node4 node5 -Hit : 269741 530654 +Hit : 364409 507527 node6 node7 -Hit : 1461771 282136 +Hit : 549698 1134258 node0 node1 Miss : 0 0 node2 node3 @@ -254,109 +254,109 @@ Foreign : 0 0 node6 node7 Foreign : 0 0 node0 node1 -Interleave_hit : 26847 26813 +Interleave_hit : 26761 26891 node2 node3 -Interleave_hit : 26848 26817 +Interleave_hit : 26754 26894 node4 node5 -Interleave_hit : 26845 26815 +Interleave_hit : 26753 26892 node6 node7 -Interleave_hit : 26841 26810 +Interleave_hit : 26758 26887 node0 node1 -Local_node : 7555332 317817 +Local_node : 4529082 258046 node2 node3 -Local_node : 1645685 1474522 +Local_node : 995697 4429452 node4 node5 -Local_node : 196934 475480 +Local_node : 271016 414199 node6 node7 -Local_node : 1257886 208813 +Local_node : 389125 1040575 node0 node1 -Other_node : 223393 73116 +Other_node : 140857 93759 node2 node3 -Other_node : 72906 72476 +Other_node : 75041 90991 node4 node5 -Other_node : 72807 55174 +Other_node : 93393 93328 node6 node7 -Other_node : 203885 73323 +Other_node : 160573 93683 4 node meminfo and numastat output with option -mn, at archive end, small env width -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:34 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:45 Per-node system memory usage (KB) node0 node1 Total : 395394544 396345396 node2 node3 -Total : 396345396 396345396 +Total : 396345396 396300724 node4 node5 Total : 396345396 396345396 node6 node7 -Total : 396345396 396191872 +Total : 396345396 396236536 node0 node1 -Free : 387723236 395335052 +Free : 388456748 395405332 node2 node3 -Free : 395301836 395340584 +Free : 394499764 394744388 node4 node5 -Free : 395489944 395342740 +Free : 395377008 395260632 node6 node7 -Free : 394823412 395314388 +Free : 394758896 395201164 node0 node1 -Used : 7671308 1010344 +Used : 6937796 940064 node2 node3 -Used : 1043560 1004812 +Used : 1845632 1556336 node4 node5 -Used : 855452 1002656 +Used : 968388 1084764 node6 node7 -Used : 1521984 877484 +Used : 1586500 1035372 node0 node1 -Active : 432604 236 +Active : 511784 168 node2 node3 -Active : 22772 6520 +Active : 60368 60940 node4 node5 -Active : 8 240 +Active : 796 488 node6 node7 -Active : 3336 356 +Active : 268 3532 node0 node1 -Inactive : 3245732 116468 +Inactive : 2720748 41812 node2 node3 -Inactive : 50588 75916 +Inactive : 778196 312512 node4 node5 -Inactive : 276 6628 +Inactive : 9880 48548 node6 node7 -Inactive : 81496 65420 +Inactive : 91680 45616 node0 node1 -Active_anon : 2448 20 +Active_anon : 3080 20 node2 node3 -Active_anon : 100 8 +Active_anon : 180 116 node4 node5 -Active_anon : 0 8 +Active_anon : 16 8 node6 node7 -Active_anon : 24 4 +Active_anon : 12 0 node0 node1 -Inactive_anon : 795080 82580 +Inactive_anon : 452236 41588 node2 node3 -Inactive_anon : 41396 9572 +Inactive_anon : 227556 150884 node4 node5 -Inactive_anon : 268 6256 +Inactive_anon : 9560 35752 node6 node7 -Inactive_anon : 40748 29864 +Inactive_anon : 74200 4880 node0 node1 -Active_file : 430156 216 +Active_file : 508704 148 node2 node3 -Active_file : 22672 6512 +Active_file : 60188 60824 node4 node5 -Active_file : 8 232 +Active_file : 780 480 node6 node7 -Active_file : 3312 352 +Active_file : 256 3532 node0 node1 -Inactive_file : 2450652 33888 +Inactive_file : 2268512 224 node2 node3 -Inactive_file : 9192 66344 +Inactive_file : 550640 161628 node4 node5 -Inactive_file : 8 372 +Inactive_file : 320 12796 node6 node7 -Inactive_file : 40748 35556 +Inactive_file : 17480 40736 node0 node1 -Unevictable : 12948 0 +Unevictable : 12932 0 node2 node3 Unevictable : 0 0 node4 node5 @@ -364,7 +364,7 @@ Unevictable : 0 0 node6 node7 Unevictable : 0 0 node0 node1 -Mlocked : 12948 0 +Mlocked : 12932 0 node2 node3 Mlocked : 0 0 node4 node5 @@ -372,9 +372,9 @@ Mlocked : 0 0 node6 node7 Mlocked : 0 0 node0 node1 -Dirty : 1688 0 - node2 node3 Dirty : 0 0 + node2 node3 +Dirty : 0 852 node4 node5 Dirty : 0 0 node6 node7 @@ -388,53 +388,53 @@ Writeback : 0 0 node6 node7 Writeback : 0 0 node0 node1 -FilePages : 2910280 34160 +FilePages : 2806088 600 node2 node3 -FilePages : 32700 72928 +FilePages : 611824 222752 node4 node5 -FilePages : 28 616 +FilePages : 1160 13312 node6 node7 -FilePages : 44104 35928 +FilePages : 17760 44304 node0 node1 -Mapped : 129092 31452 +Mapped : 114828 524 node2 node3 -Mapped : 3492 64 +Mapped : 159804 18668 node4 node5 -Mapped : 0 56 +Mapped : 660 832 node6 node7 -Mapped : 0 19420 +Mapped : 16452 512 node0 node1 -Anonpages : 765648 74064 +Anonpages : 427336 36236 node2 node3 -Anonpages : 32500 9508 +Anonpages : 210644 148764 node4 node5 -Anonpages : 256 5852 +Anonpages : 8380 35108 node6 node7 -Anonpages : 40728 29664 +Anonpages : 58896 4844 node0 node1 -Shmem : 18708 56 +Shmem : 18152 228 node2 node3 -Shmem : 836 72 +Shmem : 996 212 node4 node5 -Shmem : 12 12 +Shmem : 60 36 node6 node7 -Shmem : 44 20 +Shmem : 24 36 node0 node1 -KernelStack : 14256 9636 +KernelStack : 13584 9744 node2 node3 -KernelStack : 9588 9476 +KernelStack : 12224 11268 node4 node5 -KernelStack : 10196 11072 +KernelStack : 9588 10692 node6 node7 -KernelStack : 9984 9472 +KernelStack : 9764 10176 node0 node1 -PageTables : 15152 892 +PageTables : 10456 456 node2 node3 -PageTables : 332 264 +PageTables : 3144 4064 node4 node5 -PageTables : 4 216 +PageTables : 112 224 node6 node7 -PageTables : 132 368 +PageTables : 764 112 node0 node1 NFS_Unstable : 0 0 node2 node3 @@ -460,53 +460,53 @@ WritebackTmp : 0 0 node6 node7 WritebackTmp : 0 0 node0 node1 -Filehugepages : 8192 0 +Filehugepages : 20480 0 node2 node3 -Filehugepages : 0 0 +Filehugepages : 10240 0 node4 node5 Filehugepages : 0 0 node6 node7 Filehugepages : 0 0 node0 node1 -Filepmdmapped : 8192 0 +Filepmdmapped : 16384 0 node2 node3 -Filepmdmapped : 0 0 +Filepmdmapped : 4096 0 node4 node5 Filepmdmapped : 0 0 node6 node7 Filepmdmapped : 0 0 node0 node1 -Slab : 800568 93604 +Slab : 674560 97184 node2 node3 -Slab : 125544 152044 +Slab : 182528 340772 node4 node5 -Slab : 106200 152240 +Slab : 107220 158252 node6 node7 -Slab : 195792 86260 +Slab : 152884 137208 node0 node1 -SlabReclaimable : 414968 15728 +SlabReclaimable : 280840 14036 node2 node3 -SlabReclaimable : 30600 52008 +SlabReclaimable : 27252 191496 node4 node5 -SlabReclaimable : 14444 30800 +SlabReclaimable : 17032 58932 node6 node7 -SlabReclaimable : 33964 13936 +SlabReclaimable : 22748 24212 node0 node1 -SlabUnreclaimable : 385600 77876 +SlabUnreclaimable : 393720 83148 node2 node3 -SlabUnreclaimable : 94944 100036 +SlabUnreclaimable : 155276 149276 node4 node5 -SlabUnreclaimable : 91756 121440 +SlabUnreclaimable : 90188 99320 node6 node7 -SlabUnreclaimable : 161828 72324 +SlabUnreclaimable : 130136 112996 node0 node1 -Anonhugepages : 116736 45056 +Anonhugepages : 141312 24576 node2 node3 -Anonhugepages : 18432 8192 +Anonhugepages : 102400 16384 node4 node5 -Anonhugepages : 0 2048 +Anonhugepages : 2048 12288 node6 node7 -Anonhugepages : 2048 22528 +Anonhugepages : 36864 4096 node0 node1 Shmemhugepages : 0 0 node2 node3 @@ -556,23 +556,23 @@ SwapCached : 0 0 node6 node7 SwapCached : 0 0 node0 node1 -Kreclaimable : 414968 15728 +Kreclaimable : 280840 14036 node2 node3 -Kreclaimable : 30600 52008 +Kreclaimable : 27252 191496 node4 node5 -Kreclaimable : 14444 30800 +Kreclaimable : 17032 58932 node6 node7 -Kreclaimable : 33964 13936 +Kreclaimable : 22748 24212 NUMA memory allocation statistics (pages) node0 node1 -Hit : 7778725 390933 +Hit : 4669939 351805 node2 node3 -Hit : 1718591 1546998 +Hit : 1070738 4520443 node4 node5 -Hit : 269741 530654 +Hit : 364409 507527 node6 node7 -Hit : 1461771 282136 +Hit : 549698 1134258 node0 node1 Miss : 0 0 node2 node3 @@ -590,139 +590,139 @@ Foreign : 0 0 node6 node7 Foreign : 0 0 node0 node1 -Interleave_hit : 26847 26813 +Interleave_hit : 26761 26891 node2 node3 -Interleave_hit : 26848 26817 +Interleave_hit : 26754 26894 node4 node5 -Interleave_hit : 26845 26815 +Interleave_hit : 26753 26892 node6 node7 -Interleave_hit : 26841 26810 +Interleave_hit : 26758 26887 node0 node1 -Local_node : 7555332 317817 +Local_node : 4529082 258046 node2 node3 -Local_node : 1645685 1474522 +Local_node : 995697 4429452 node4 node5 -Local_node : 196934 475480 +Local_node : 271016 414199 node6 node7 -Local_node : 1257886 208813 +Local_node : 389125 1040575 node0 node1 -Other_node : 223393 73116 +Other_node : 140857 93759 node2 node3 -Other_node : 72906 72476 +Other_node : 75041 90991 node4 node5 -Other_node : 72807 55174 +Other_node : 93393 93328 node6 node7 -Other_node : 203885 73323 +Other_node : 160573 93683 8 node process output with option -p, at archive end with multiple pids -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:33 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:44 Per-node process memory usage (in MBs) PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total ---------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- -1 (systemd) 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 +1 (systemd) 14.98 0.00 0.35 1.31 0.02 0.13 0.00 0.00 16.79 2 (kthreadd) 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ---------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- -Total 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 +Total 14.98 0.00 0.35 1.31 0.02 0.13 0.00 0.00 16.79 8 node process output with option -p, at archive end with single process name -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:34 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:45 Per-node process memory usage (in MBs) -PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total ----------------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- -1 (systemd) 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 -6267 (systemd-journal) 12.06 0.02 0.02 0.02 0.00 0.00 0.00 0.00 12.12 -6316 (systemd-udevd) 14.64 0.00 0.17 0.16 0.23 0.08 0.25 0.27 15.80 -8684 (systemd-logind) 9.71 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9.71 -8700 (dbus-daemon) 6.28 0.00 0.00 0.00 0.00 0.00 0.02 0.00 6.30 -13920 (systemd) 9.51 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9.51 -19096 (systemd) 9.23 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9.23 -19917 (systemd) 9.27 0.14 0.00 0.00 0.00 0.00 0.00 0.00 9.41 ----------------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- -Total 87.03 0.41 0.19 0.20 0.23 0.08 0.27 0.27 88.68 +PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total +----------------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +1 (systemd) 14.98 0.00 0.35 1.31 0.02 0.13 0.00 0.00 16.79 +6242 (systemd-journal) 14.46 0.00 0.03 0.02 0.00 0.02 0.00 0.00 14.53 +6291 (systemd-udevd) 14.28 0.03 0.09 0.59 0.79 0.00 0.00 0.00 15.78 +8654 (systemd-logind) 9.57 0.00 0.03 0.00 0.00 0.00 0.01 0.00 9.61 +8668 (dbus-daemon) 6.26 0.00 0.03 0.00 0.00 0.00 0.00 0.00 6.29 +15998 (systemd) 7.97 0.00 1.32 0.00 0.00 0.00 0.02 0.00 9.31 +19818 (systemd) 9.20 0.00 0.01 0.00 0.00 0.00 0.15 0.00 9.36 +68515 (systemd-hostnam) 9.14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 9.14 +----------------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- +Total 85.86 0.03 1.86 1.92 0.81 0.15 0.18 0.00 90.81 8 node process output with option -p, at archive end with single pid -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:33 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:44 Per-node process memory usage (in MBs) for PID 1 (systemd) Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- Huge 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 -Heap 5.89 0.25 0.00 0.02 0.00 0.00 0.00 0.00 6.16 -Stack 0.05 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.05 -Private 10.39 0.00 0.00 0.00 0.00 0.00 0.00 0.00 10.39 +Heap 4.57 0.00 0.29 1.25 0.02 0.13 0.00 0.00 6.26 +Stack 0.02 0.00 0.00 0.02 0.00 0.00 0.00 0.00 0.04 +Private 10.39 0.00 0.06 0.04 0.00 0.00 0.00 0.00 10.49 ---------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- --------------- -Total 16.33 0.25 0.00 0.02 0.00 0.00 0.00 0.00 16.60 +Total 14.98 0.00 0.35 1.31 0.02 0.13 0.00 0.00 16.79 8 node process output with option -p, at archive end with single pid -Linux 5.15.0-316.196.4.1.el8uek.x86_64 (ssosharm-bm-01) 03/16/26 x86_64 (512 CPU) -Timestamp : 03/16/2026 15:48:33 +Linux 5.15.0-317.197.5.1.el8uek.x86_64 (localhost.localdomain) 03/20/26 x86_64 (512 CPU) +Timestamp : 03/20/2026 06:02:44 Per-node process memory usage (in MBs) PID Node 0 ------------------ --------------- -1 (systemd) 16.33 -8700 (dbus-daemon) 6.28 +1 (systemd) 14.98 +8668 (dbus-daemon) 6.26 ------------------ --------------- -Total 22.61 +Total 21.24 PID Node 1 ------------------ --------------- -1 (systemd) 0.25 -8700 (dbus-daemon) 0.00 +1 (systemd) 0.00 +8668 (dbus-daemon) 0.00 ------------------ --------------- -Total 0.25 +Total 0.00 PID Node 2 ------------------ --------------- -1 (systemd) 0.00 -8700 (dbus-daemon) 0.00 +1 (systemd) 0.35 +8668 (dbus-daemon) 0.03 ------------------ --------------- -Total 0.00 +Total 0.38 PID Node 3 ------------------ --------------- -1 (systemd) 0.02 -8700 (dbus-daemon) 0.00 +1 (systemd) 1.31 +8668 (dbus-daemon) 0.00 ------------------ --------------- -Total 0.02 +Total 1.31 PID Node 4 ------------------ --------------- -1 (systemd) 0.00 -8700 (dbus-daemon) 0.00 +1 (systemd) 0.02 +8668 (dbus-daemon) 0.00 ------------------ --------------- -Total 0.00 +Total 0.02 PID Node 5 ------------------ --------------- -1 (systemd) 0.00 -8700 (dbus-daemon) 0.00 +1 (systemd) 0.13 +8668 (dbus-daemon) 0.00 ------------------ --------------- -Total 0.00 +Total 0.13 PID Node 6 ------------------ --------------- 1 (systemd) 0.00 -8700 (dbus-daemon) 0.02 +8668 (dbus-daemon) 0.00 ------------------ --------------- -Total 0.02 +Total 0.00 PID Node 7 ------------------ --------------- 1 (systemd) 0.00 -8700 (dbus-daemon) 0.00 +8668 (dbus-daemon) 0.00 ------------------ --------------- Total 0.00 PID Total ------------------ --------------- -1 (systemd) 16.60 -8700 (dbus-daemon) 6.30 +1 (systemd) 16.79 +8668 (dbus-daemon) 6.29 ------------------ --------------- -Total 22.90 +Total 23.08 diff --git a/qa/archives/pcp-numastat-8-node.0.xz b/qa/archives/pcp-numastat-8-node.0.xz index 2e369c1e73113172d586e126b7c3e5d6e7149627..c3c3110242d36bbd7e78f2083eb9548b8fb4158e 100644 GIT binary patch literal 60504 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 diff --git a/qa/archives/pcp-numastat-8-node.index.xz b/qa/archives/pcp-numastat-8-node.index.xz index 010c5310e1204f50be0f88ace6707cd76e25c115..92f5ee4977a8b562ba71be7599a8cdc6685ffc62 100644 GIT binary patch delta 228 zcmVDfa~|fG=2)w#^<$7tPMnn z&|BU{c#=u?UYu#=R?8revS_H*M6OW&abNfx+*kR~;w!qzvF|@PlF7a){dhj$OcT>L zO*nCB|I;r$zTc>Q6b36E9ux;dRR|_uI_YLJ??$=i-z=+?3Za10JIMkJLtX#ueX_V_lMCgRKYeC$IoQRl}2U egD&I%0n`DA2><{O2BuK4#Ao{g000001X)^6a%Ld_ delta 220 zcmV<203-kS0q_Bk9DlD}003YL*32mhNRTTSLv9X0aVBq#{SdjK=Wg+q`~)PDTU5lA z)fo9LSt7{Q32?C??o$Hga9bRZO4vL4lN{vi3s0vGw}uxnG=wj_GM@Lx?two5c8gWZ zDTyd`%H9cxcOYw0N=ScEW^YpxJQ>AW5QWXd!pj92pmg~sCsj2^)}S}e+}!&^tnivB z=vX&3$E3X?K@y6WMgsC+u37?h?f)LIofSGQN*)}{AOHZ;LLL)e5s6^{0m}i1 W2><{=wkD#n#Ao{g000001X)_YI9$B| diff --git a/qa/archives/pcp-numastat-8-node.meta.xz b/qa/archives/pcp-numastat-8-node.meta.xz index 62b4f32344fe22dde4c3665c12833971d3e0a662..04d56d65c5fb0e73cb8ca9fa365236e35d377f72 100644 GIT binary patch literal 35064 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/numa_maps) Hugepage map values are reported as comma-separated node/value pairs, e.g. -node0:0.00,node1:4.00, where each value is in megabytes. +node0:0.00,node1:4.00 where each value is in megabytes. @ proc.numa_maps.heap per-node heap mapped memory in MB (/proc//numa_maps) Heap map values are reported as comma-separated node/value pairs, e.g. -node0:0.00,node1:4.00, where each value is in megabytes. +node0:0.00,node1:4.00 where each value is in megabytes. @ proc.numa_maps.stack per-node stack mapped memory in MB (/proc//numa_maps) Stack map values are reported as comma-separated node/value pairs, e.g. -node0:0.00,node1:4.00, where each value is in megabytes. +node0:0.00,node1:4.00 where each value is in megabytes. @ proc.numa_maps.private per-node private mapped memory in MB (/proc//numa_maps) Private map values are reported as comma-separated node/value pairs, e.g. -node0:0.00,node1:4.00, where each value is in megabytes. +node0:0.00,node1:4.00 where each value is in megabytes. @ proc.control.all.threads process indom includes threads If set to one, the process instance domain as reported by pmdaproc diff --git a/src/pmdas/linux_proc/proc_pid.c b/src/pmdas/linux_proc/proc_pid.c index 2efb2ff29e1..2526bd0795f 100644 --- a/src/pmdas/linux_proc/proc_pid.c +++ b/src/pmdas/linux_proc/proc_pid.c @@ -2595,7 +2595,8 @@ append_numa_maps_node(strbuf_t *b, int node_num, double value_mb) size_t needed, newcap; int n; - n = pmsprintf(tmp, sizeof(tmp), "node%d:%.2f,", node_num, value_mb); + n = pmsprintf(tmp, sizeof(tmp), "%snode%d:%.2f", + b->len > 0 ? "," : "", node_num, value_mb); if (n < 0 || n >= (int)sizeof(tmp)) return -E2BIG; From 0473ab3ea7ed98a00000eb2b71384b096b5d61de Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Sat, 21 Mar 2026 12:00:15 +1100 Subject: [PATCH 24/31] src/libpcp/src/logmeta.c: more __pmLogUndeltaInDom() remediation Over at https://github.com/performancecopilot/pcp/pull/2525 it is becoming evident that pmproxy maybe feeding __pmLogUndeltaInDom() delta indoms with an incomplete history of earlier indoms, so the undelta'ing is either wrong or incomplete. Checks added in the last round of logmeta.c changes were detecting problems but the workaround (skipping) logic was wrong, leading to assert()s for Jan, although it passes QA for me (because we have nothing in our QA suite that accurately exercises pmproxy in this scenario). After digesting Jan's latest comments, I made more changes for qa/src/undelta.c and qa/1655 was able to reproduce the assert()s and then rework the logmeta.c code. With these changes QA check -g indom -g pmproxy -g archive -g archive_v3 are all passing, which is as much testing as I can do in the QA Farm. --- qa/1654.out | 40 ++++++++++++++++++++++++----------- qa/1655.out | 40 ++++++++++++++++++++++++----------- qa/src/undelta.c | 45 +++++++++++++++++++++++++++++++++------- src/libpcp/src/logmeta.c | 29 ++++++++++++++++---------- 4 files changed, 112 insertions(+), 42 deletions(-) diff --git a/qa/1654.out b/qa/1654.out index 7fd79aff62e..5fc60ef0ff9 100644 --- a/qa/1654.out +++ b/qa/1654.out @@ -1,44 +1,60 @@ QA output created by 1654 +__pmLogUndeltaInDom: Botch: InDom 42.13: full inst[5]=5 "external 05" and redefined in delta inst[3]=5 "redefined 05", second one skipped +__pmLogUndeltaInDom: Botch: InDom 42.13: delta inst[4]=7 delete but inst not in full indom, skipped +__pmLogUndeltaInDom: Botch: InDom 42.13: full inst[5]=5 "external 05" and redefined in delta inst[3]=5 "redefined 05", second one skipped +__pmLogUndeltaInDom: Botch: InDom 42.13: delta inst[4]=7 delete but inst not in full indom, skipped === malloc namelist[] == dump lidp1 after build() __pmLogInDom @ ADDR -12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 5 +12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 6 [0] 0 "external 00" ADDR [1] 1 "external 01" ADDR [2] 2 "external 02" ADDR [3] 3 "external 03" ADDR [4] 4 "external 04" ADDR +[5] 5 "external 05" ADDR == dump lidp2 after build() __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 1 numinst: 4 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 1 numinst: 8 [0] 0 NULL [1] 2 NULL -[2] 11 "external 11" ADDR -[3] 13 "external 13" ADDR +[2] 4 NULL +[3] 5 "redefined 05" ADDR +[4] 7 NULL +[5] 11 "external 11" ADDR +[6] 13 "external 13" ADDR +[7] 15 "external 15" ADDR == dump lidp2 after __pmLogUndeltaInDom __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 5 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 6 [0] 1 "external 01" ADDR [1] 3 "external 03" ADDR -[2] 4 "external 04" ADDR +[2] 5 "external 05" ADDR [3] 11 "external 11" ADDR [4] 13 "external 13" ADDR +[5] 15 "external 15" ADDR === namelist[] not malloc'd == dump lidp1 after build() __pmLogInDom @ ADDR -12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST isdelta: 0 numinst: 5 +12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST isdelta: 0 numinst: 6 [0] 0 "external 00" ADDR [1] 1 "external 01" ADDR [2] 2 "external 02" ADDR [3] 3 "external 03" ADDR [4] 4 "external 04" ADDR +[5] 5 "external 05" ADDR == dump lidp2 after build() __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST isdelta: 1 numinst: 4 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST isdelta: 1 numinst: 8 [0] 0 NULL [1] 2 NULL -[2] 11 "external 11" ADDR -[3] 13 "external 13" ADDR +[2] 4 NULL +[3] 5 "redefined 05" ADDR +[4] 7 NULL +[5] 11 "external 11" ADDR +[6] 13 "external 13" ADDR +[7] 15 "external 15" ADDR == dump lidp2 after __pmLogUndeltaInDom __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 5 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 6 [0] 1 "external 01" ADDR [1] 3 "external 03" ADDR -[2] 4 "external 04" ADDR +[2] 5 "external 05" ADDR [3] 11 "external 11" ADDR [4] 13 "external 13" ADDR +[5] 15 "external 15" ADDR diff --git a/qa/1655.out b/qa/1655.out index cde6c3882df..ac9943a0faa 100644 --- a/qa/1655.out +++ b/qa/1655.out @@ -3,48 +3,64 @@ QA output created by 1654 --valgrind === std out === === malloc namelist[] == dump lidp1 after build() __pmLogInDom @ ADDR -12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 5 +12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 6 [0] 0 "external 00" ADDR [1] 1 "external 01" ADDR [2] 2 "external 02" ADDR [3] 3 "external 03" ADDR [4] 4 "external 04" ADDR +[5] 5 "external 05" ADDR == dump lidp2 after build() __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 1 numinst: 4 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 1 numinst: 8 [0] 0 NULL [1] 2 NULL -[2] 11 "external 11" ADDR -[3] 13 "external 13" ADDR +[2] 4 NULL +[3] 5 "redefined 05" ADDR +[4] 7 NULL +[5] 11 "external 11" ADDR +[6] 13 "external 13" ADDR +[7] 15 "external 15" ADDR == dump lidp2 after __pmLogUndeltaInDom __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 5 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 6 [0] 1 "external 01" ADDR [1] 3 "external 03" ADDR -[2] 4 "external 04" ADDR +[2] 5 "external 05" ADDR [3] 11 "external 11" ADDR [4] 13 "external 13" ADDR +[5] 15 "external 15" ADDR === namelist[] not malloc'd == dump lidp1 after build() __pmLogInDom @ ADDR -12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST isdelta: 0 numinst: 5 +12:34:56.000000100 alloc: SELF|INSTLIST|NAMELIST isdelta: 0 numinst: 6 [0] 0 "external 00" ADDR [1] 1 "external 01" ADDR [2] 2 "external 02" ADDR [3] 3 "external 03" ADDR [4] 4 "external 04" ADDR +[5] 5 "external 05" ADDR == dump lidp2 after build() __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST isdelta: 1 numinst: 4 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST isdelta: 1 numinst: 8 [0] 0 NULL [1] 2 NULL -[2] 11 "external 11" ADDR -[3] 13 "external 13" ADDR +[2] 4 NULL +[3] 5 "redefined 05" ADDR +[4] 7 NULL +[5] 11 "external 11" ADDR +[6] 13 "external 13" ADDR +[7] 15 "external 15" ADDR == dump lidp2 after __pmLogUndeltaInDom __pmLogInDom @ ADDR -12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 5 +12:34:56.000000200 alloc: SELF|INSTLIST|NAMELIST|NAMES isdelta: 0 numinst: 6 [0] 1 "external 01" ADDR [1] 3 "external 03" ADDR -[2] 4 "external 04" ADDR +[2] 5 "external 05" ADDR [3] 11 "external 11" ADDR [4] 13 "external 13" ADDR +[5] 15 "external 15" ADDR === std err === +__pmLogUndeltaInDom: Botch: InDom 42.13: full inst[5]=5 "external 05" and redefined in delta inst[3]=5 "redefined 05", second one skipped +__pmLogUndeltaInDom: Botch: InDom 42.13: delta inst[4]=7 delete but inst not in full indom, skipped +__pmLogUndeltaInDom: Botch: InDom 42.13: full inst[5]=5 "external 05" and redefined in delta inst[3]=5 "redefined 05", second one skipped +__pmLogUndeltaInDom: Botch: InDom 42.13: delta inst[4]=7 delete but inst not in full indom, skipped === filtered valgrind report === Memcheck, a memory error detector Command: src/undelta diff --git a/qa/src/undelta.c b/qa/src/undelta.c index a99d4f7c9e2..0836764f46e 100644 --- a/qa/src/undelta.c +++ b/qa/src/undelta.c @@ -110,6 +110,7 @@ build(int alloc) int i; int k; + /* full indom */ lidp1 = (__pmLogInDom *)malloc(sizeof(__pmLogInDom)); lidp1->alloc = PMLID_SELF|alloc|PMLID_NAMELIST|PMLID_INSTLIST; lidp1->next = lidp1->prior = NULL; @@ -117,7 +118,7 @@ build(int alloc) lidp1->stamp.sec = 12 * 3600 + 34 * 60 + 56; /* 12:34:56 UTC */ lidp1->stamp.nsec = 100; lidp1->isdelta = 0; - num2 = lidp1->numinst = 5; + num2 = lidp1->numinst = 6; /* needs to be an even number */ lidp1->namelist = (char **)malloc(lidp1->numinst * sizeof(char *)); if (name1 != NULL) free(name1); @@ -135,31 +136,60 @@ build(int alloc) } lidp1->buf = NULL; + /* delta indom */ lidp2 = (__pmLogInDom *)malloc(sizeof(__pmLogInDom)); lidp2->alloc = PMLID_SELF|alloc|PMLID_NAMELIST|PMLID_INSTLIST; lidp2->indom = indom; lidp2->stamp.sec = 12 * 3600 + 34 * 60 + 56; /* 12:34:56 UTC */ lidp2->stamp.nsec = 200; lidp2->isdelta = 1; - num2 = lidp2->numinst = lidp1->numinst - 1; + /* + * for plus 2 for the bad entries at the end + */ + num2 = lidp2->numinst = lidp1->numinst + 2; lidp2->namelist = (char **)malloc(lidp2->numinst * sizeof(char *)); if (name2 != NULL) free(name2); name2 = (char **)malloc(lidp2->numinst * sizeof(char *)); lidp2->instlist = (int *)malloc(lidp2->numinst * sizeof(int)); - /* delete some instances */ + /* + * needs to be in instance identifier order ... so deletions + * first for all the even numbered instances + */ k = 0; - for (i = 0; i < lidp2->numinst; i++) { + for (i = 0; i < lidp1->numinst; i++) { if ((i & 1) == 0) { lidp2->instlist[k] = i; name2[k] = lidp2->namelist[k] = NULL; k++; } } - /* add some instances */ - for (i = 0; i < lidp2->numinst; i++) { + + /* + * next a bad addition re-using the same instance id as the last + * one in the full indom (and different name) + */ + lidp2->instlist[k] = lidp1->numinst - 1; + pmsprintf(p, sizeof(buf) - (p-buf), "redefined %02d", lidp1->numinst - 1); + if (alloc == PMLID_NAMES) + name2[k] = lidp2->namelist[k] = strdup(p); + else { + name2[k] = lidp2->namelist[k] = p; + p += strlen(p) + 1; + } + k++; + + /* next a bad deletion for an instance *not* in the full indom */ + lidp2->instlist[k] = lidp1->numinst + 1; + name2[k] = lidp2->namelist[k] = NULL; + k++; + + /* + * add some instances with id's equal to the existing odd nummbered + * instances + 10 + */ + for (i = 0; i < lidp1->numinst; i++) { if (i & 1) { - /* add instance */ lidp2->instlist[k] = i+10; pmsprintf(p, sizeof(buf) - (p-buf), "external %02d", i+10); if (alloc == PMLID_NAMES) @@ -171,6 +201,7 @@ build(int alloc) k++; } } + lidp2->buf = NULL; /* link entries ... "next" is reverse chronological order */ diff --git a/src/libpcp/src/logmeta.c b/src/libpcp/src/logmeta.c index 8c305425a29..82a5c958356 100644 --- a/src/libpcp/src/logmeta.c +++ b/src/libpcp/src/logmeta.c @@ -1200,13 +1200,15 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) int j; /* index over delta indom */ int k; /* index over new full indom we're building */ assert (didp->isdelta == 1); - numinst = didp->next->numinst; - for (j = 0; j < didp->numinst; j++) { - if (didp->namelist[j] != NULL) - numinst++; - else - numinst--; - } + assert(fidp == didp->next); + /* + * we need to over estimate here, because if a delta indom entry + * specifies delete for an instance (namelist[j] == NULL) we won't + * reduce the number of instances in the output indom unless + * instlist[j] matches some instlist[i] in the full indom, and + * we won't discover that until later on in this routine. + */ + numinst = fidp->numinst + didp->numinst; if ((instlist = (int *)malloc(numinst * sizeof(instlist[0]))) == NULL) { pmNoMem("__pmLogUndeltaInDom instlist", numinst * sizeof(instlist[0]), PM_FATAL_ERR); /*NOTREACHED*/ @@ -1228,9 +1230,14 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) if (i < fidp->numinst && j < didp->numinst && fidp->instlist[i] == didp->instlist[j]) { if (didp->namelist[j] != NULL) { - /* Woops! */ - pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: full inst[%d]=%d \"%s\" and redefined in delta inst[%d]=%d \"%s\", second one skipped\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf)), i, fidp->instlist[i], fidp->namelist[i], j, didp->instlist[j], didp->namelist[j]); - pmflush(); + if (strcmp(fidp->namelist[i], didp->namelist[j]) != 0) { + /* + * Woops! + * Redefined with different external instance name + */ + pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: full inst[%d]=%d \"%s\" and redefined in delta inst[%d]=%d \"%s\", second one skipped\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf)), i, fidp->instlist[i], fidp->namelist[i], j, didp->instlist[j], didp->namelist[j]); + pmflush(); + } j++; } else { @@ -1309,7 +1316,7 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) free(didp->namelist); /* update didp */ didp->instlist = instlist; - didp->numinst = numinst; + didp->numinst = k; didp->namelist = namelist; didp->isdelta = 0; didp->alloc |= PMLID_INSTLIST|PMLID_NAMELIST|PMLID_NAMES; From 77f49af34e7d8837b46935b0db4a72898f7f1a68 Mon Sep 17 00:00:00 2001 From: Nathan Scott Date: Sat, 21 Mar 2026 13:10:06 +1100 Subject: [PATCH 25/31] build: fix macOS build where pid_t is typedef to __darwin_pid_t --- src/include/pcp/config.h.in | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/include/pcp/config.h.in b/src/include/pcp/config.h.in index f693dd4560c..aa090f8c440 100644 --- a/src/include/pcp/config.h.in +++ b/src/include/pcp/config.h.in @@ -765,9 +765,6 @@ /* Define to `long int' if does not define. */ #undef off_t -/* Define to `int' if does not define. */ -#undef pid_t - /* Define to `unsigned int' if does not define. */ #undef size_t From 95b6e16bb90ab7afe5d89215f4ae100328963fcb Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Sun, 22 Mar 2026 07:44:44 +1100 Subject: [PATCH 26/31] qa/1131: more portable use of jq(1) "jq ." is better than "jq" ... the latter failed on vm01 (i686 Ubuntu 18.04). --- qa/1131 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/1131 b/qa/1131 index 69158f78b67..f85f4089b59 100755 --- a/qa/1131 +++ b/qa/1131 @@ -77,7 +77,7 @@ s/ 85.0.0 / PMID / _filter_pcp2opentelemetry() { tee -a $here/$seq.full \ - | jq \ + | jq . \ | sed \ -e 's/\"stringValue\": \"[^\"]*\"/\"stringValue\": \"VALUE\"/g'\ -e 's/\"timeUnixNano\": \"[^\"]*\"/\"timeUnixNano\": \"TIME\"/g'\ From 37e1aafd1ef22c81203bd4ab48f3a4724e77340e Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Sun, 22 Mar 2026 07:48:17 +1100 Subject: [PATCH 27/31] src/libpcp/src/logmeta.c: __pmLogUndeleteInDom() tweak realloc() the instlist[] and namelist[] arrays for the output indom if they were over-allocated at the start of this routine. --- src/libpcp/src/logmeta.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/libpcp/src/logmeta.c b/src/libpcp/src/logmeta.c index 82a5c958356..59326b57073 100644 --- a/src/libpcp/src/logmeta.c +++ b/src/libpcp/src/logmeta.c @@ -1202,11 +1202,15 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) assert (didp->isdelta == 1); assert(fidp == didp->next); /* - * we need to over estimate here, because if a delta indom entry + * we need to over-allocate here, because if a delta indom entry * specifies delete for an instance (namelist[j] == NULL) we won't * reduce the number of instances in the output indom unless * instlist[j] matches some instlist[i] in the full indom, and * we won't discover that until later on in this routine. + * + * the upper bound is the number of instances in the full indom plus + * the number of instances in the delta indom (for the all addition, + * no deletions case) */ numinst = fidp->numinst + didp->numinst; if ((instlist = (int *)malloc(numinst * sizeof(instlist[0]))) == NULL) { @@ -1315,9 +1319,23 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) if (didp->alloc & PMLID_NAMELIST) free(didp->namelist); /* update didp */ - didp->instlist = instlist; - didp->numinst = k; - didp->namelist = namelist; + if (k < numinst) { + /* shrink arrays that were over-allocated */ + numinst = k; + if ((didp->instlist = (int *)realloc(instlist, numinst * sizeof(instlist[0]))) == NULL) { + pmNoMem("__pmLogUndeltaInDom realloc instlist", numinst * sizeof(instlist[0]), PM_FATAL_ERR); + /*NOTREACHED*/ + } + if ((didp->namelist = (char **)realloc(namelist, numinst * sizeof(namelist[0]))) == NULL) { + pmNoMem("__pmLogUndeltaInDom realloc namelist", numinst * sizeof(namelist[0]), PM_FATAL_ERR); + /*NOTREACHED*/ + } + } + else { + didp->instlist = instlist; + didp->namelist = namelist; + } + didp->numinst = numinst; didp->isdelta = 0; didp->alloc |= PMLID_INSTLIST|PMLID_NAMELIST|PMLID_NAMES; From fed1b80e19a3b7ab8e7887cbcbf2958681c10a2b Mon Sep 17 00:00:00 2001 From: Ken McDonell Date: Sun, 22 Mar 2026 07:58:44 +1100 Subject: [PATCH 28/31] src/libpcp3/src/logmeta.c: back port __pmLogUndeltaInDom() After changes made in the current libpcp. --- src/libpcp3/src/logmeta.c | 184 ++++++++++++++++++++++++++++---------- 1 file changed, 135 insertions(+), 49 deletions(-) diff --git a/src/libpcp3/src/logmeta.c b/src/libpcp3/src/logmeta.c index 3cef9cd4d23..70c687b0ecf 100644 --- a/src/libpcp3/src/logmeta.c +++ b/src/libpcp3/src/logmeta.c @@ -1151,10 +1151,19 @@ PM_FAULT_POINT("libpcp/" __FILE__ ":5", PM_FAULT_ALLOC); return __pmHashAdd((int)dp->pmid, (void *)tdp, &lcp->hashpmid); } +/* + * idp is the delta indom assumed to be in the (archive) + * hashindom hash from a __pmLogCtl + * + * Undelta'ing this indom involves going backwards in time from + * idp along the temporal chain until we find a "full" indom, then + * going forwards in time undelta'ing each indom until we reach + * and process idp. + */ void __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) { - __pmLogInDom *tidp; /* full indom */ + __pmLogInDom *fidp; /* full indom */ __pmLogInDom *didp; /* delta indom */ char strbuf[20]; @@ -1166,20 +1175,20 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) /* * "next" is in reverse chronological order */ - for (tidp = idp->next; tidp != NULL; tidp = tidp->next) { + for (fidp = idp->next; fidp != NULL; fidp = fidp->next) { if (pmDebugOptions.logmeta && pmDebugOptions.desperate) { - fprintf(stderr, "try next: " PRINTF_P_PFX "%p @", tidp); - StrTimestamp(&tidp->stamp); - fprintf(stderr, " next=" PRINTF_P_PFX "%p prior=" PRINTF_P_PFX "%p numinst=%d isdelta=%d\n", tidp->next, tidp->prior, tidp->numinst, tidp->isdelta); + fprintf(stderr, "try next: " PRINTF_P_PFX "%p @", fidp); + StrTimestamp(&fidp->stamp); + fprintf(stderr, " next=" PRINTF_P_PFX "%p prior=" PRINTF_P_PFX "%p numinst=%d isdelta=%d\n", fidp->next, fidp->prior, fidp->numinst, fidp->isdelta); } - if (!tidp->isdelta) + if (!fidp->isdelta) break; } - if (tidp == NULL) { + if (fidp == NULL) { pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: no full indom record\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf))); pmprintf("__pmLogInDom next chain:\n"); - for (tidp = idp; tidp != NULL; tidp = tidp->next) { - pmprintf("%p isdelta=%d numinst=%d\n", tidp, tidp->isdelta, tidp->numinst); + for (fidp = idp; fidp != NULL; fidp = fidp->next) { + pmprintf("%p isdelta=%d numinst=%d\n", fidp, fidp->isdelta, fidp->numinst); } pmflush(); return; @@ -1187,9 +1196,15 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) /* * found the previous full indom, now march forward in time replacing - * each delta indom with a reconstructed full indom + * each delta indom with a reconstructed full indom ... stop when we + * have replaced idp by a full indom + * + * The undelta'd indom has a newly alloc'd instlist[] and namelist[] + * and strdup'd namelist[i] entries to avoid any storage mangling + * between the full (input) indoms, the delta indoms and the full + * (output) indoms (PMLID_NAMES set in alloc bitfield). */ - for (didp = tidp->prior ; didp != NULL; ) { + for (didp = fidp->prior ; didp != NULL; ) { int numinst; int *instlist; char **namelist; @@ -1197,13 +1212,19 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) int j; /* index over delta indom */ int k; /* index over new full indom we're building */ assert (didp->isdelta == 1); - numinst = didp->next->numinst; - for (j = 0; j < didp->numinst; j++) { - if (didp->namelist[j] != NULL) - numinst++; - else - numinst--; - } + assert(fidp == didp->next); + /* + * we need to over-allocate here, because if a delta indom entry + * specifies delete for an instance (namelist[j] == NULL) we won't + * reduce the number of instances in the output indom unless + * instlist[j] matches some instlist[i] in the full indom, and + * we won't discover that until later on in this routine. + * + * the upper bound is the number of instances in the full indom plus + * the number of instances in the delta indom (for the all addition, + * no deletions case) + */ + numinst = fidp->numinst + didp->numinst; if ((instlist = (int *)malloc(numinst * sizeof(instlist[0]))) == NULL) { pmNoMem("__pmLogUndeltaInDom instlist", numinst * sizeof(instlist[0]), PM_FATAL_ERR); /*NOTREACHED*/ @@ -1217,63 +1238,128 @@ __pmLogUndeltaInDom(pmInDom indom, __pmLogInDom *idp) StrTimestamp(&didp->stamp); fprintf(stderr, " next=" PRINTF_P_PFX "%p prior=" PRINTF_P_PFX "%p numinst=%d (-> %d) isdelta=%d\n", didp->next, didp->prior, didp->numinst, numinst, didp->isdelta); } - for (i = j = k = 0; i < tidp->numinst || j < didp->numinst; ) { - if (i < tidp->numinst && j < didp->numinst) { - if (didp->namelist[j] == NULL && tidp->instlist[i] == didp->instlist[j]) { - /* delete old instance */ + /* + * need to process all instances from both the full indom and + * the delta indom ... + */ + for (i = j = k = 0; i < fidp->numinst || j < didp->numinst; ) { + if (i < fidp->numinst && j < didp->numinst && + fidp->instlist[i] == didp->instlist[j]) { + if (didp->namelist[j] != NULL) { + if (strcmp(fidp->namelist[i], didp->namelist[j]) != 0) { + /* + * Woops! + * Redefined with different external instance name + */ + pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: full inst[%d]=%d \"%s\" and redefined in delta inst[%d]=%d \"%s\", second one skipped\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf)), i, fidp->instlist[i], fidp->namelist[i], j, didp->instlist[j], didp->namelist[j]); + pmflush(); + } + j++; + } + else { + /* + * inst id's are equal, but namelist[] from delta + * indom is NULL => this instance was in the + * indom but is no longer there (deleted), so simply + * move over this one, and nothing goes in the + * undelta'd indom + */ if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[-] del from [%d] inst %d \"%s\"\n", j, tidp->instlist[i], tidp->namelist[i]); + fprintf(stderr, "[-] del from full [%d] inst %d \"%s\"\n", i, fidp->instlist[i], fidp->namelist[i]); i++; j++; - continue; } - else if (didp->namelist[j] != NULL && tidp->instlist[i] > didp->instlist[j]) { - /* add new instance in correct sorted position */ + } + else if (i >= fidp->numinst || + (j < didp->numinst && didp->instlist[j] < fidp->instlist[i] )) { + /* + * full indom all processed or inst id from delta indom is + * less than inst id from full indom so add instance from + * delta indom + */ + if (didp->namelist[j] == NULL) { + /* Woops! */ + pmprintf("__pmLogUndeltaInDom: Botch: InDom %s: delta inst[%d]=%d delete but inst not in full indom, skipped\n", pmInDomStr_r(indom, strbuf, sizeof(strbuf)), j, didp->instlist[j]); + pmflush(); + j++; + } + else { if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[%d] add from [%d] inst %d \"%s\"\n", k, j, didp->instlist[j], didp->namelist[j]); + fprintf(stderr, "[%d] add from delta [%d] inst %d \"%s\"\n", k, j, didp->instlist[j], didp->namelist[j]); assert (k < numinst); instlist[k] = didp->instlist[j]; - namelist[k] = didp->namelist[j]; + if ((namelist[k] = strdup(didp->namelist[j])) == NULL) { + pmNoMem("__pmLogUndeltaInDom name from delta", strlen(didp->namelist[j]), PM_FATAL_ERR); + /* NOTREACHED */ + } k++; j++; - continue; } } - if (i < tidp->numinst) { - /* copy instance from end of old indom */ + else { + /* + * delta indom all processed or inst id from full indom is + * less than inst id from delta indom so add instance from + * full indom + */ if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[%d] dup from [%d] inst %d \"%s\"\n", k, i, tidp->instlist[i], tidp->namelist[i]); - assert(k < numinst); - instlist[k] = tidp->instlist[i]; - namelist[k] = tidp->namelist[i]; + fprintf(stderr, "[%d] add from full [%d] inst %d \"%s\"\n", k, i, fidp->instlist[i], fidp->namelist[i]); + assert(fidp->namelist[i] != NULL); + assert (k < numinst); + instlist[k] = fidp->instlist[i]; + if ((namelist[k] = strdup(fidp->namelist[i])) == NULL) { + pmNoMem("__pmLogUndeltaInDom name from full", strlen(fidp->namelist[j]), PM_FATAL_ERR); + } k++; i++; } - else if (j < didp->numinst) { - /* add new instance at end of indom */ - if (pmDebugOptions.logmeta && pmDebugOptions.desperate) - fprintf(stderr, "[%d] append from [%d] inst %d \"%s\"\n", k, j, didp->instlist[j], didp->namelist[j]); - assert(k < numinst); - instlist[k] = didp->instlist[j]; - namelist[k] = didp->namelist[j]; - k++; - j++; + } + + /* + * didp is going to be totally replaced by instlist[] and namelist[] + * constructed above, so free any space currently allocated to + * didp + */ + if (didp->alloc & PMLID_NAMES) { + for (j = 0; j < didp->numinst; j++) { + if (didp->namelist[j] != NULL) + free(didp->namelist[j]); } } - didp->numinst = numinst; - didp->instlist = instlist; + if (didp->alloc & PMLID_INSTLIST) + free(didp->instlist); if (didp->alloc & PMLID_NAMELIST) free(didp->namelist); - didp->namelist = namelist; + /* update didp */ + if (k < numinst) { + /* shrink arrays that were over-allocated */ + numinst = k; + if ((didp->instlist = (int *)realloc(instlist, numinst * sizeof(instlist[0]))) == NULL) { + pmNoMem("__pmLogUndeltaInDom realloc instlist", numinst * sizeof(instlist[0]), PM_FATAL_ERR); + /*NOTREACHED*/ + } + if ((didp->namelist = (char **)realloc(namelist, numinst * sizeof(namelist[0]))) == NULL) { + pmNoMem("__pmLogUndeltaInDom realloc namelist", numinst * sizeof(namelist[0]), PM_FATAL_ERR); + /*NOTREACHED*/ + } + } + else { + didp->instlist = instlist; + didp->namelist = namelist; + } + didp->numinst = numinst; didp->isdelta = 0; - didp->alloc |= PMLID_INSTLIST|PMLID_NAMELIST; + didp->alloc |= PMLID_INSTLIST|PMLID_NAMELIST|PMLID_NAMES; if (didp == idp) { /* done when we're back to the starting point */ break; } - tidp = didp; + /* + * "prior" is in chronological order + */ + fidp = didp; didp = didp->prior; } } From 95fe35c176c9394ddcef0af5f4d50606308c77d1 Mon Sep 17 00:00:00 2001 From: Sourav Sharma Date: Mon, 23 Mar 2026 11:26:11 +0000 Subject: [PATCH 29/31] Added an overflow check for hugepagesize value Signed-off-by: Sourav Sharma --- src/pmdas/linux_proc/pmda.c | 7 ++++++- src/pmdas/linux_proc/proc_pid.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/pmdas/linux_proc/pmda.c b/src/pmdas/linux_proc/pmda.c index b8cc860ebfb..b62e7437bef 100644 --- a/src/pmdas/linux_proc/pmda.c +++ b/src/pmdas/linux_proc/pmda.c @@ -3993,7 +3993,12 @@ proc_hugepagesize(void) } fclose(fs); - return huge_page_size_kb * 1024; + /* Guard against overflow (CID 502014) */ + if (huge_page_size_kb > ULONG_MAX / 1024UL) { + return 0; + } + + return huge_page_size_kb * 1024UL; } /* diff --git a/src/pmdas/linux_proc/proc_pid.c b/src/pmdas/linux_proc/proc_pid.c index 2526bd0795f..adc7c6291be 100644 --- a/src/pmdas/linux_proc/proc_pid.c +++ b/src/pmdas/linux_proc/proc_pid.c @@ -2711,7 +2711,7 @@ parse_proc_numa_maps(proc_pid_entry_t *ep, size_t buflen, char *buf) huge_page_size_bytes = (double)_pm_system_hugepagesize; if (huge_page_size_bytes <= 0.0) - huge_page_size_bytes = page_size_bytes; + huge_page_size_bytes = 2048 * 1024; // Taking a common hugepagesize value as a fallback while (cur < end && *cur) { char *nl = memchr(cur, '\n', (size_t)(end - cur)); From 481f8d9ff54428aa1d2e4c2d6dff3d174ea3a0a2 Mon Sep 17 00:00:00 2001 From: Nathan Scott Date: Tue, 24 Mar 2026 08:50:21 +1100 Subject: [PATCH 30/31] build: add debian Vcs-Git and Vcs-Browser metadata --- debian/control.pcp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/control.pcp b/debian/control.pcp index c65e5636c6c..c9c949fe678 100644 --- a/debian/control.pcp +++ b/debian/control.pcp @@ -25,6 +25,8 @@ Build-Depends: bison, flex, gawk, procps, pkg-config, debhelper (>= 11), ?{libdrm-dev}, ?{python-pymongo}, ?{python-urllib3}, ?{libdbi-perl}, ?{python-pyodbc}, ?{perl-xs-dev}, manpages Standards-Version: 4.7.2 +Vcs-Git: https://github.com/performancecopilot/pcp.git +Vcs-Browser: https://github.com/performancecopilot/pcp X-Python3-Version: >= 3.6 Package: pcp From c776dbe8e9f73c0b34fa264f26459df372b6b20b Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Wed, 25 Mar 2026 13:13:39 +1100 Subject: [PATCH 31/31] macOS CI: surface installer logs on failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -dumplog inlines the full install log into CI output, and a dedicated debug step tails /var/log/install.log when the install step fails — so we can actually see what went wrong. --- .github/workflows/macOS.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index a8c882fd2cd..c01db20c570 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -105,7 +105,12 @@ jobs: echo "Found PKG: $PKG_PATH" # Install (sudo is passwordless in GitHub Actions) - sudo installer -pkg "$PKG_PATH" -target / -verbose + sudo installer -pkg "$PKG_PATH" -target / -verbose -dumplog + - name: Debug on install failure + if: failure() && steps.install-test.conclusion == 'failure' + run: | + echo "=== /var/log/install.log (last 100 lines) ===" + sudo tail -100 /var/log/install.log - name: Verify Installation if: success() && steps.install-test.conclusion == 'success' run: |