]> git.proxmox.com Git - zfsonlinux.git/blob - debian/patches/0009-arc-stat-summary-guard-access-to-l2arc-MFU-MRU-stats.patch
cherry-pick fix for data corruption
[zfsonlinux.git] / debian / patches / 0009-arc-stat-summary-guard-access-to-l2arc-MFU-MRU-stats.patch
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 Date: Wed, 10 Nov 2021 09:29:47 +0100
4 Subject: [PATCH] arc stat/summary: guard access to l2arc MFU/MRU stats
5
6 commit 085321621e79a75bea41c2b6511da6ebfbf2ba0a added printing MFU
7 and MRU stats for 2.1 user space tools, but those keys are not
8 available in the 2.0 module. That means it may break the arcstat and
9 arc_summary tools after upgrade to 2.1 (user space), before a reboot
10 to the new 2.1 ZFS kernel-module happened, due to python raising a
11 KeyError on the dict access then.
12
13 Move those two keys to a .get accessor with `0` as fallback, as it
14 should be better to show some possible wrong data for new stat-keys
15 than throwing an exception.
16
17 Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
18
19 also move l2_mfu_asize l2_mru_asize l2_prefetch_asize
20 l2_bufc_data_asize l2_bufc_metadata_asize to .get accessor
21 (these are only present with a cache device in the pool)
22 Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
23 Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
24 ---
25 cmd/arc_summary | 28 ++++++++++++++--------------
26 cmd/arcstat.in | 14 +++++++-------
27 2 files changed, 21 insertions(+), 21 deletions(-)
28
29 diff --git a/cmd/arc_summary b/cmd/arc_summary
30 index 426e02070..9de198150 100755
31 --- a/cmd/arc_summary
32 +++ b/cmd/arc_summary
33 @@ -655,13 +655,13 @@ def section_arc(kstats_dict):
34 prt_i1('L2 cached evictions:', f_bytes(arc_stats['evict_l2_cached']))
35 prt_i1('L2 eligible evictions:', f_bytes(arc_stats['evict_l2_eligible']))
36 prt_i2('L2 eligible MFU evictions:',
37 - f_perc(arc_stats['evict_l2_eligible_mfu'],
38 + f_perc(arc_stats.get('evict_l2_eligible_mfu', 0), # 2.0 module compat
39 arc_stats['evict_l2_eligible']),
40 - f_bytes(arc_stats['evict_l2_eligible_mfu']))
41 + f_bytes(arc_stats.get('evict_l2_eligible_mfu', 0)))
42 prt_i2('L2 eligible MRU evictions:',
43 - f_perc(arc_stats['evict_l2_eligible_mru'],
44 + f_perc(arc_stats.get('evict_l2_eligible_mru', 0), # 2.0 module compat
45 arc_stats['evict_l2_eligible']),
46 - f_bytes(arc_stats['evict_l2_eligible_mru']))
47 + f_bytes(arc_stats.get('evict_l2_eligible_mru', 0)))
48 prt_i1('L2 ineligible evictions:',
49 f_bytes(arc_stats['evict_l2_ineligible']))
50 print()
51 @@ -851,20 +851,20 @@ def section_l2arc(kstats_dict):
52 f_perc(arc_stats['l2_hdr_size'], arc_stats['l2_size']),
53 f_bytes(arc_stats['l2_hdr_size']))
54 prt_i2('MFU allocated size:',
55 - f_perc(arc_stats['l2_mfu_asize'], arc_stats['l2_asize']),
56 - f_bytes(arc_stats['l2_mfu_asize']))
57 + f_perc(arc_stats.get('l2_mfu_asize', 0), arc_stats['l2_asize']),
58 + f_bytes(arc_stats.get('l2_mfu_asize', 0))) # 2.0 module compat
59 prt_i2('MRU allocated size:',
60 - f_perc(arc_stats['l2_mru_asize'], arc_stats['l2_asize']),
61 - f_bytes(arc_stats['l2_mru_asize']))
62 + f_perc(arc_stats.get('l2_mru_asize', 0), arc_stats['l2_asize']),
63 + f_bytes(arc_stats.get('l2_mru_asize', 0))) # 2.0 module compat
64 prt_i2('Prefetch allocated size:',
65 - f_perc(arc_stats['l2_prefetch_asize'], arc_stats['l2_asize']),
66 - f_bytes(arc_stats['l2_prefetch_asize']))
67 + f_perc(arc_stats.get('l2_prefetch_asize', 0), arc_stats['l2_asize']),
68 + f_bytes(arc_stats.get('l2_prefetch_asize',0))) # 2.0 module compat
69 prt_i2('Data (buffer content) allocated size:',
70 - f_perc(arc_stats['l2_bufc_data_asize'], arc_stats['l2_asize']),
71 - f_bytes(arc_stats['l2_bufc_data_asize']))
72 + f_perc(arc_stats.get('l2_bufc_data_asize', 0), arc_stats['l2_asize']),
73 + f_bytes(arc_stats.get('l2_bufc_data_asize', 0))) # 2.0 module compat
74 prt_i2('Metadata (buffer content) allocated size:',
75 - f_perc(arc_stats['l2_bufc_metadata_asize'], arc_stats['l2_asize']),
76 - f_bytes(arc_stats['l2_bufc_metadata_asize']))
77 + f_perc(arc_stats.get('l2_bufc_metadata_asize', 0), arc_stats['l2_asize']),
78 + f_bytes(arc_stats.get('l2_bufc_metadata_asize', 0))) # 2.0 module compat
79
80 print()
81 prt_1('L2ARC breakdown:', f_hits(l2_access_total))
82 diff --git a/cmd/arcstat.in b/cmd/arcstat.in
83 index 8df1c62f7..833348d0e 100755
84 --- a/cmd/arcstat.in
85 +++ b/cmd/arcstat.in
86 @@ -565,8 +565,8 @@ def calculate():
87 v["el2skip"] = d["evict_l2_skip"] // sint
88 v["el2cach"] = d["evict_l2_cached"] // sint
89 v["el2el"] = d["evict_l2_eligible"] // sint
90 - v["el2mfu"] = d["evict_l2_eligible_mfu"] // sint
91 - v["el2mru"] = d["evict_l2_eligible_mru"] // sint
92 + v["el2mfu"] = d.get("evict_l2_eligible_mfu", 0) // sint
93 + v["el2mru"] = d.get("evict_l2_eligible_mru", 0) // sint
94 v["el2inel"] = d["evict_l2_ineligible"] // sint
95 v["mtxmis"] = d["mutex_miss"] // sint
96
97 @@ -581,11 +581,11 @@ def calculate():
98 v["l2size"] = cur["l2_size"]
99 v["l2bytes"] = d["l2_read_bytes"] // sint
100
101 - v["l2pref"] = cur["l2_prefetch_asize"]
102 - v["l2mfu"] = cur["l2_mfu_asize"]
103 - v["l2mru"] = cur["l2_mru_asize"]
104 - v["l2data"] = cur["l2_bufc_data_asize"]
105 - v["l2meta"] = cur["l2_bufc_metadata_asize"]
106 + v["l2pref"] = cur.get("l2_prefetch_asize", 0)
107 + v["l2mfu"] = cur.get("l2_mfu_asize", 0)
108 + v["l2mru"] = cur.get("l2_mru_asize", 0)
109 + v["l2data"] = cur.get("l2_bufc_data_asize", 0)
110 + v["l2meta"] = cur.get("l2_bufc_metadata_asize", 0)
111 v["l2pref%"] = 100 * v["l2pref"] // v["l2asize"]
112 v["l2mfu%"] = 100 * v["l2mfu"] // v["l2asize"]
113 v["l2mru%"] = 100 * v["l2mru"] // v["l2asize"]