From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Wed, 10 Nov 2021 09:29:47 +0100 Subject: [PATCH] arc stat/summary: guard access to l2arc MFU/MRU stats commit 085321621e79a75bea41c2b6511da6ebfbf2ba0a added printing MFU and MRU stats for 2.1 user space tools, but those keys are not available in the 2.0 module. That means it may break the arcstat and arc_summary tools after upgrade to 2.1 (user space), before a reboot to the new 2.1 ZFS kernel-module happened, due to python raising a KeyError on the dict access then. Move those two keys to a .get accessor with `0` as fallback, as it should be better to show some possible wrong data for new stat-keys than throwing an exception. Signed-off-by: Thomas Lamprecht --- cmd/arc_summary/arc_summary3 | 8 ++++---- cmd/arcstat/arcstat.in | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/arc_summary/arc_summary3 b/cmd/arc_summary/arc_summary3 index 7b28012ed..0a81b2bc7 100755 --- a/cmd/arc_summary/arc_summary3 +++ b/cmd/arc_summary/arc_summary3 @@ -617,13 +617,13 @@ def section_arc(kstats_dict): prt_i1('L2 cached evictions:', f_bytes(arc_stats['evict_l2_cached'])) prt_i1('L2 eligible evictions:', f_bytes(arc_stats['evict_l2_eligible'])) prt_i2('L2 eligible MFU evictions:', - f_perc(arc_stats['evict_l2_eligible_mfu'], + f_perc(arc_stats.get('evict_l2_eligible_mfu', 0), # 2.0 module compat arc_stats['evict_l2_eligible']), - f_bytes(arc_stats['evict_l2_eligible_mfu'])) + f_bytes(arc_stats.get('evict_l2_eligible_mfu', 0))) prt_i2('L2 eligible MRU evictions:', - f_perc(arc_stats['evict_l2_eligible_mru'], + f_perc(arc_stats.get('evict_l2_eligible_mru', 0), # 2.0 module compat arc_stats['evict_l2_eligible']), - f_bytes(arc_stats['evict_l2_eligible_mru'])) + f_bytes(arc_stats.get('evict_l2_eligible_mru', 0))) prt_i1('L2 ineligible evictions:', f_bytes(arc_stats['evict_l2_ineligible'])) print() diff --git a/cmd/arcstat/arcstat.in b/cmd/arcstat/arcstat.in index cd9a803a2..6878419e7 100755 --- a/cmd/arcstat/arcstat.in +++ b/cmd/arcstat/arcstat.in @@ -482,8 +482,8 @@ def calculate(): v["el2skip"] = d["evict_l2_skip"] // sint v["el2cach"] = d["evict_l2_cached"] // sint v["el2el"] = d["evict_l2_eligible"] // sint - v["el2mfu"] = d["evict_l2_eligible_mfu"] // sint - v["el2mru"] = d["evict_l2_eligible_mru"] // sint + v["el2mfu"] = d.get("evict_l2_eligible_mfu", 0) // sint + v["el2mru"] = d.get("evict_l2_eligible_mru", 0) // sint v["el2inel"] = d["evict_l2_ineligible"] // sint v["mtxmis"] = d["mutex_miss"] // sint