summaryrefslogtreecommitdiff
path: root/buildscripts
diff options
context:
space:
mode:
authorLouis Williams <louis.williams@mongodb.com>2021-09-08 21:32:07 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-09-08 22:15:50 +0000
commit2481934027b43267b3bcb521ae029705cb290fdd (patch)
treecc915634a01c2ba188b16be16aec2acbb7cb5a8f /buildscripts
parent810acb9723a4e74897ac446ed755221faa56e650 (diff)
downloadmongo-2481934027b43267b3bcb521ae029705cb290fdd.tar.gz
SERVER-58949 RecordId supports long strings
Diffstat (limited to 'buildscripts')
-rw-r--r--buildscripts/gdb/mongo_printers.py21
1 files changed, 15 insertions, 6 deletions
diff --git a/buildscripts/gdb/mongo_printers.py b/buildscripts/gdb/mongo_printers.py
index db6b6590c69..ae937cd6811 100644
--- a/buildscripts/gdb/mongo_printers.py
+++ b/buildscripts/gdb/mongo_printers.py
@@ -224,21 +224,30 @@ class RecordIdPrinter(object):
def to_string(self):
"""Return RecordId for printing."""
- buf_size = 16
- rid_format = self.val["_buffer"][buf_size - 1]
+ rid_format = int(self.val["_format"])
if rid_format == 0:
- return "null"
+ return "null RecordId"
elif rid_format == 1:
hex_bytes = [int(self.val['_buffer'][i]) for i in range(8)]
raw_bytes = bytes(hex_bytes)
- return struct.unpack('l', raw_bytes)[0]
+ return "RecordId long: %s" % struct.unpack('l', raw_bytes)[0]
elif rid_format == 2:
str_len = int(self.val["_buffer"][0])
raw_bytes = [int(self.val['_buffer'][i]) for i in range(1, str_len + 1)]
hex_bytes = [hex(b & 0xFF)[2:].zfill(2) for b in raw_bytes]
- return str("".join(hex_bytes))
+ return "RecordId small string %d hex bytes: %s" % (str_len, str("".join(hex_bytes)))
+ elif rid_format == 3:
+ holder_ptr = self.val["_ownedBuffer"]["_buffer"]["_holder"]["px"]
+ holder = holder_ptr.dereference()
+ str_len = int(holder["_capacity"])
+ # Start of data is immediately after pointer for holder
+ start_ptr = (holder_ptr + 1).dereference().cast(gdb.lookup_type("char")).address
+ raw_bytes = [int(start_ptr[i]) for i in range(1, str_len + 1)]
+ hex_bytes = [hex(b & 0xFF)[2:].zfill(2) for b in raw_bytes]
+ return "RecordId big string %d hex bytes @ %s: %s" % (str_len, holder_ptr + 1,
+ str("".join(hex_bytes)))
else:
- return "invalid RecordId format"
+ return "unknown RecordId format: %d" % rid_format
class DecorablePrinter(object):