(this description of the fix is added to the patch as well)
bal_rank_mask is stored as a text string with a decimal representation
of a number inside. The string is stored as length of the string (4
bytes, little endian) and then the string itself (without trailing 0,
just the string itself).
max_xattr_size is stored as uint64_t little endian integer.
The following patch was used to get the hexdumps below:
diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc
index 76a57ac443..d36bed2257 100644
--- a/src/mon/MDSMonitor.cc
+++ b/src/mon/MDSMonitor.cc
@@ -143,6 +143,7 @@ void MDSMonitor::update_from_paxos(bool *need_bootstrap)
ceph_assert(fsmap_bl.length() > 0);
dout(10) << __func__ << " got " << version << dendl;
+ fsmap_bl.hexdump(std::cout);
try {
PaxosFSMap::decode(fsmap_bl);
} catch (const ceph::buffer::malformed_input& e) {
This is how the relevant part of the bufferlist looks like for the squid
snapshot 19.2.0~git20240301.4c76c50-0ubuntu6:
ceph-mon[...]: 00000620 00 00 00 00 00 00 00 00 00 00 00 00 01 07 00 00
|................|
ceph-mon[...]: 00000630 00 63 65 70 68 2d 66 73 00 00 00 00 00 00 00 00
|.ceph-fs........|
ceph-mon[...]: 00000640 ff ff ff ff 00 00 00 00 00 00 00 00 00 02 00 00
|................|
******** <<<
bal_rank_mask
string length
(4 bytes,
the value is 2)
the top byte of the
string length >>>>>>>>> ** ##### <<< bal_rank_mask itself (it's string "-1"
here)
ceph-mon[...]: 00000650 00 2d 31 00 00 01 00 00 00 00 00 00 00 00 00 00
|.-1.............|
^^^^^^^^^^^^^^^^^^^^^^^^ max_xattr_size
(the default value
65536)
ceph-mon[...]: 00000660 00 00 00 00 00 00 00 01 01 05 00 00 00 00 00 00
|................|
ceph-mon[...]: 00000670 00 00 01 00 00 00 b1 17 00 00 00 00 00 00 01 00
|................|
ceph-mon[...]: 00000680 00 00 00 00 00 00 00 00 00 00 01 a1 6e ad 67 53
|............n.gS|
And this is how the relevant part of the bufferlist looks like for
the squid release 19.2.0-0ubuntu0.24.04.1:
ceph-mon[...]: 000003a0 00 00 00 00 00 00 00 00 01 07 00 00 00 63 65 70
|.............cep|
ceph-mon[...]: 000003b0 68 2d 66 73 00 00 00 00 00 00 00 00 ff ff ff ff
|h-fs............|
ceph-mon[...]: 000003c0 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00
|................|
^^^^^^^^^^^^^^^^^^^^
vv <<<<<<<<<<<<<<<<<<<<<<<< max_xattr_size (8 bytes,
the value is 65536)
ceph-mon[...]: 000003d0 00 02 00 00 00 2d 31 01 01 05 00 00 00 00 00 00
|.....-1.........|
^^^^^^^^^^^ ##### <<< bal_rank_mask (string, the
value is "-1")
bal_rank_mask string length (2)
The fix for the bug looks at the byte 4 bytes ahead (if the current
position is 0x3C9, then the code would look at the byte at 0x3CD). In
the squid release the byte most likely would be 0 (it could be non-zero
for 4GiB+ extended attributes, which is highly unlikely). In the
snapshot it would be the first char of a decimal representation of a
number, which is either "-" (0x2D) or a number (a value from 0x30 to
0x39). This patch assumes that max_xattr_size is less than 64GiB and
checks the byte against 0x10, and then uses the correct decoding order
for bal_rank_mask and max_xattr_size for each situation.
** Patch added: "src/mds/MDSMap: decode max_xattr_size and bal_rank_mask in the
right order"
https://bugs.launchpad.net/ubuntu/+source/ceph/+bug/2089565/+attachment/5859087/+files/mds-MDSMap-decode-max_xattr_size-and-bal_rank_mask.patch
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2089565
Title:
MON and MDS crash upgrading CEPH on ubuntu 24.04 LTS
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/ceph/+bug/2089565/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs