diff options
author | Louis Williams <louis.williams@mongodb.com> | 2021-09-08 21:32:07 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-09-08 22:15:50 +0000 |
commit | 2481934027b43267b3bcb521ae029705cb290fdd (patch) | |
tree | cc915634a01c2ba188b16be16aec2acbb7cb5a8f /buildscripts | |
parent | 810acb9723a4e74897ac446ed755221faa56e650 (diff) | |
download | mongo-2481934027b43267b3bcb521ae029705cb290fdd.tar.gz |
SERVER-58949 RecordId supports long strings
Diffstat (limited to 'buildscripts')
-rw-r--r-- | buildscripts/gdb/mongo_printers.py | 21 |
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): |