Skip to content

Commit d742eb8

Browse files
committed
sstable: fix layout footer printing
Fix reading attributes from footer for layout `Describe` method.
1 parent bbcf034 commit d742eb8

File tree

3 files changed

+216
-3
lines changed

3 files changed

+216
-3
lines changed

sstable/layout.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,11 @@ func (l *Layout) Describe(
150150
panic("Error parsing table format.")
151151
}
152152

153+
var attributes Attributes
154+
if format >= TableFormatPebblev7 {
155+
attributes = Attributes(binary.LittleEndian.Uint32(trailer[pebbleDBV7FooterAttributesOffset:]))
156+
}
157+
153158
var computedChecksum uint32
154159
var encodedChecksum uint32
155160
if format >= TableFormatPebblev6 {
@@ -192,7 +197,6 @@ func (l *Layout) Describe(
192197

193198
if format >= TableFormatPebblev7 {
194199
// Attributes should be just prior to the checksum.
195-
attributes := Attributes(binary.LittleEndian.Uint32(trailer[pebbleDBV7FooterAttributesOffset:]))
196200
tpNode.Childf("%03d attributes: %s", offset-attributesLen, attributes.String())
197201
}
198202

sstable/testdata/writer_blob_value_handles

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ sstable
291291
├── 000 checksum type: crc32c
292292
├── 001 meta: offset=767, length=46
293293
├── 004 index: offset=159, length=36
294-
├── 041 attributes: [RangeKeySets,RangeKeyUnsets,RangeKeyDels,TwoLevelIndex]
294+
├── 041 attributes: [BlobValues]
295295
├── 045 footer checksum: 0x2ee54544
296296
├── 049 version: 7
297297
└── 053 magic number: 0xf09faab3f09faab3

sstable/testdata/writer_value_blocks

Lines changed: 210 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,215 @@ sstable
10511051
└── 049 magic number: 0xf09faab3f09faab3
10521052

10531053
# Same as above but with (Pebble,v7) [footer attributes].
1054+
build table-format=Pebble,v7
1055+
blue@10.SET.20:blue10
1056+
blue@8.SET.18:blue8
1057+
blue@8.SET.16:blue8s
1058+
blue@6.DEL.14:
1059+
blue@4.SET.12:blue4
1060+
blue@3.SET.10:blue3
1061+
red@9.SET.18:red9
1062+
red@7.SET.8:red7
1063+
----
1064+
value-blocks: num-values 4, num-blocks: 1, size: 33
1065+
1066+
scan
1067+
----
1068+
blue@10#20,SET:blue10
1069+
blue@8#18,SET:blue8
1070+
blue@8#16,SET:blue8s
1071+
blue@6#14,DEL:
1072+
blue@4#12,SET:blue4
1073+
blue@3#10,SET:blue3
1074+
red@9#18,SET:red9
1075+
red@7#8,SET:red7
1076+
1077+
scan-cloned-lazy-values
1078+
----
1079+
0(in-place: len 6): blue10
1080+
1(lazy: len 5, attr: 5): blue8
1081+
2(lazy: len 6, attr: 6): blue8s
1082+
3(in-place: len 0):
1083+
4(in-place: len 5): blue4
1084+
5(lazy: len 5, attr: 5): blue3
1085+
6(in-place: len 4): red9
1086+
7(lazy: len 4, attr: 4): red7
1087+
1088+
layout
1089+
----
1090+
sstable
1091+
├── data offset: 0 length: 186
1092+
│ ├── data block header
1093+
│ │ ├── columnar block header
1094+
│ │ │ ├── 000-004: x 07000000 # maximum key length: 7
1095+
│ │ │ ├── 004-005: x 01 # version 1
1096+
│ │ │ ├── 005-007: x 0700 # 7 columns
1097+
│ │ │ ├── 007-011: x 08000000 # 8 rows
1098+
│ │ │ ├── 011-012: b 00000100 # col 0: prefixbytes
1099+
│ │ │ ├── 012-016: x 2e000000 # col 0: page start 46
1100+
│ │ │ ├── 016-017: b 00000011 # col 1: bytes
1101+
│ │ │ ├── 017-021: x 41000000 # col 1: page start 65
1102+
│ │ │ ├── 021-022: b 00000010 # col 2: uint
1103+
│ │ │ ├── 022-026: x 5c000000 # col 2: page start 92
1104+
│ │ │ ├── 026-027: b 00000001 # col 3: bool
1105+
│ │ │ ├── 027-031: x 6e000000 # col 3: page start 110
1106+
│ │ │ ├── 031-032: b 00000011 # col 4: bytes
1107+
│ │ │ ├── 032-036: x 80000000 # col 4: page start 128
1108+
│ │ │ ├── 036-037: b 00000001 # col 5: bool
1109+
│ │ │ ├── 037-041: x a9000000 # col 5: page start 169
1110+
│ │ │ ├── 041-042: b 00000001 # col 6: bool
1111+
│ │ │ └── 042-046: x c0000000 # col 6: page start 192
1112+
│ │ ├── data for column 0 (prefixbytes)
1113+
│ │ │ ├── 046-047: x 04 # bundle size: 16
1114+
│ │ │ ├── offsets table
1115+
│ │ │ │ ├── 047-048: x 01 # encoding: 1b
1116+
│ │ │ │ ├── 048-049: x 00 # data[0] = 0 [58 overall]
1117+
│ │ │ │ ├── 049-050: x 00 # data[1] = 0 [58 overall]
1118+
│ │ │ │ ├── 050-051: x 04 # data[2] = 4 [62 overall]
1119+
│ │ │ │ ├── 051-052: x 04 # data[3] = 4 [62 overall]
1120+
│ │ │ │ ├── 052-053: x 04 # data[4] = 4 [62 overall]
1121+
│ │ │ │ ├── 053-054: x 04 # data[5] = 4 [62 overall]
1122+
│ │ │ │ ├── 054-055: x 04 # data[6] = 4 [62 overall]
1123+
│ │ │ │ ├── 055-056: x 04 # data[7] = 4 [62 overall]
1124+
│ │ │ │ ├── 056-057: x 07 # data[8] = 7 [65 overall]
1125+
│ │ │ │ └── 057-058: x 07 # data[9] = 7 [65 overall]
1126+
│ │ │ └── data
1127+
│ │ │ ├── 058-058: x # data[00]: (block prefix)
1128+
│ │ │ ├── 058-058: x # data[01]: (bundle prefix)
1129+
│ │ │ ├── 058-062: x 626c7565 # data[02]: blue
1130+
│ │ │ ├── 062-062: x # data[03]: ....
1131+
│ │ │ ├── 062-062: x # data[04]: ....
1132+
│ │ │ ├── 062-062: x # data[05]: ....
1133+
│ │ │ ├── 062-062: x # data[06]: ....
1134+
│ │ │ ├── 062-062: x # data[07]: ....
1135+
│ │ │ ├── 062-065: x 726564 # data[08]: red
1136+
│ │ │ └── 065-065: x # data[09]: ...
1137+
│ │ ├── data for column 1 (bytes)
1138+
│ │ │ ├── offsets table
1139+
│ │ │ │ ├── 065-066: x 01 # encoding: 1b
1140+
│ │ │ │ ├── 066-067: x 00 # data[0] = 0 [75 overall]
1141+
│ │ │ │ ├── 067-068: x 03 # data[1] = 3 [78 overall]
1142+
│ │ │ │ ├── 068-069: x 05 # data[2] = 5 [80 overall]
1143+
│ │ │ │ ├── 069-070: x 07 # data[3] = 7 [82 overall]
1144+
│ │ │ │ ├── 070-071: x 09 # data[4] = 9 [84 overall]
1145+
│ │ │ │ ├── 071-072: x 0b # data[5] = 11 [86 overall]
1146+
│ │ │ │ ├── 072-073: x 0d # data[6] = 13 [88 overall]
1147+
│ │ │ │ ├── 073-074: x 0f # data[7] = 15 [90 overall]
1148+
│ │ │ │ └── 074-075: x 11 # data[8] = 17 [92 overall]
1149+
│ │ │ └── data
1150+
│ │ │ ├── 075-078: x 403130 # data[0]: @10
1151+
│ │ │ ├── 078-080: x 4038 # data[1]: @8
1152+
│ │ │ ├── 080-082: x 4038 # data[2]: @8
1153+
│ │ │ ├── 082-084: x 4036 # data[3]: @6
1154+
│ │ │ ├── 084-086: x 4034 # data[4]: @4
1155+
│ │ │ ├── 086-088: x 4033 # data[5]: @3
1156+
│ │ │ ├── 088-090: x 4039 # data[6]: @9
1157+
│ │ │ └── 090-092: x 4037 # data[7]: @7
1158+
│ │ ├── data for column 2 (uint)
1159+
│ │ │ ├── 092-093: x 02 # encoding: 2b
1160+
│ │ │ ├── 093-094: x 00 # padding (aligning to 16-bit boundary)
1161+
│ │ │ ├── 094-096: x 0114 # data[0] = 5121
1162+
│ │ │ ├── 096-098: x 0112 # data[1] = 4609
1163+
│ │ │ ├── 098-100: x 0110 # data[2] = 4097
1164+
│ │ │ ├── 100-102: x 000e # data[3] = 3584
1165+
│ │ │ ├── 102-104: x 010c # data[4] = 3073
1166+
│ │ │ ├── 104-106: x 010a # data[5] = 2561
1167+
│ │ │ ├── 106-108: x 0112 # data[6] = 4609
1168+
│ │ │ └── 108-110: x 0108 # data[7] = 2049
1169+
│ │ ├── data for column 3 (bool)
1170+
│ │ │ ├── 110-111: x 00 # default bitmap encoding
1171+
│ │ │ ├── 111-112: x 00 # padding to align to 64-bit boundary
1172+
│ │ │ ├── 112-120: b 0100000100000000000000000000000000000000000000000000000000000000 # bitmap word 0
1173+
│ │ │ └── 120-128: b 0000000100000000000000000000000000000000000000000000000000000000 # bitmap summary word 0-63
1174+
│ │ ├── data for column 4 (bytes)
1175+
│ │ │ ├── offsets table
1176+
│ │ │ │ ├── 128-129: x 01 # encoding: 1b
1177+
│ │ │ │ ├── 129-130: x 00 # data[0] = 0 [138 overall]
1178+
│ │ │ │ ├── 130-131: x 06 # data[1] = 6 [144 overall]
1179+
│ │ │ │ ├── 131-132: x 0a # data[2] = 10 [148 overall]
1180+
│ │ │ │ ├── 132-133: x 0e # data[3] = 14 [152 overall]
1181+
│ │ │ │ ├── 133-134: x 0e # data[4] = 14 [152 overall]
1182+
│ │ │ │ ├── 134-135: x 13 # data[5] = 19 [157 overall]
1183+
│ │ │ │ ├── 135-136: x 17 # data[6] = 23 [161 overall]
1184+
│ │ │ │ ├── 136-137: x 1b # data[7] = 27 [165 overall]
1185+
│ │ │ │ └── 137-138: x 1f # data[8] = 31 [169 overall]
1186+
│ │ │ └── data
1187+
│ │ │ ├── 138-144: x 626c75653130 # data[0]: blue10
1188+
│ │ │ ├── 144-148: x a5050000 # data[1]: "\xa5\x05\x00\x00"
1189+
│ │ │ ├── 148-152: x a6060005 # data[2]: "\xa6\x06\x00\x05"
1190+
│ │ │ ├── 152-152: x # data[3]:
1191+
│ │ │ ├── 152-157: x 626c756534 # data[4]: blue4
1192+
│ │ │ ├── 157-161: x a505000b # data[5]: "\xa5\x05\x00\v"
1193+
│ │ │ ├── 161-165: x 72656439 # data[6]: red9
1194+
│ │ │ └── 165-169: x a4040010 # data[7]: "\xa4\x04\x00\x10"
1195+
│ │ ├── data for column 5 (bool)
1196+
│ │ │ ├── 169-170: x 00 # default bitmap encoding
1197+
│ │ │ ├── 170-176: x 000000000000 # padding to align to 64-bit boundary
1198+
│ │ │ ├── 176-184: b 1010011000000000000000000000000000000000000000000000000000000000 # bitmap word 0
1199+
│ │ │ └── 184-192: b 0000000100000000000000000000000000000000000000000000000000000000 # bitmap summary word 0-63
1200+
│ │ ├── data for column 6 (bool)
1201+
│ │ │ ├── 192-193: x 00 # default bitmap encoding
1202+
│ │ │ ├── 193-200: x 00000000000000 # padding to align to 64-bit boundary
1203+
│ │ │ ├── 200-208: b 0000010000000000000000000000000000000000000000000000000000000000 # bitmap word 0
1204+
│ │ │ └── 208-216: b 0000000100000000000000000000000000000000000000000000000000000000 # bitmap summary word 0-63
1205+
│ │ └── 216-217: x 00 # block padding byte
1206+
│ ├── blue@10#20,SET:blue10
1207+
│ ├── blue@8#18,SET:value handle {ValueLen:5 BlockNum:0 OffsetInBlock:0}
1208+
│ ├── blue@8#16,SET:value handle {ValueLen:6 BlockNum:0 OffsetInBlock:5}
1209+
│ ├── blue@6#14,DEL:
1210+
│ ├── blue@4#12,SET:blue4
1211+
│ ├── blue@3#10,SET:value handle {ValueLen:5 BlockNum:0 OffsetInBlock:11}
1212+
│ ├── red@9#18,SET:red9
1213+
│ ├── red@7#8,SET:value handle {ValueLen:4 BlockNum:0 OffsetInBlock:16}
1214+
│ └── trailer [compression=snappy checksum=0x194cf241]
1215+
├── index offset: 191 length: 36
1216+
│ ├── 00000 block:0/186
1217+
│ │
1218+
│ └── trailer [compression=none checksum=0x8e45fa7b]
1219+
├── value-block offset: 232 length: 20
1220+
│ └── trailer [compression=none checksum=0x460ef26f]
1221+
├── value-index offset: 257 length: 3
1222+
│ └── trailer [compression=none checksum=0x762643d7]
1223+
├── properties offset: 265 length: 575
1224+
│ ├── 00000 obsolete-key (13)
1225+
│ ├── 00013 pebble.colblk.schema (65)
1226+
│ ├── 00078 pebble.num.value-blocks (24)
1227+
│ ├── 00102 pebble.num.values.in.value-blocks (34)
1228+
│ ├── 00136 pebble.raw.point-tombstone.key.size (36)
1229+
│ ├── 00172 pebble.value-blocks.size (25)
1230+
│ ├── 00197 rocksdb.block.based.table.index.type (40)
1231+
│ ├── 00237 rocksdb.comparator (42)
1232+
│ ├── 00279 rocksdb.compression (25)
1233+
│ ├── 00304 rocksdb.compression_options (122)
1234+
│ ├── 00426 rocksdb.data.size (19)
1235+
│ ├── 00445 rocksdb.deleted.keys (21)
1236+
│ ├── 00466 rocksdb.filter.size (20)
1237+
│ ├── 00486 rocksdb.index.size (19)
1238+
│ ├── 00505 rocksdb.merge.operands (23)
1239+
│ ├── 00528 rocksdb.merge.operator (40)
1240+
│ ├── 00568 rocksdb.num.data.blocks (24)
1241+
│ ├── 00592 rocksdb.num.entries (20)
1242+
│ ├── 00612 rocksdb.num.range-deletions (28)
1243+
│ ├── 00640 rocksdb.property.collectors (41)
1244+
│ ├── 00681 rocksdb.raw.key.size (21)
1245+
│ ├── 00702 rocksdb.raw.value.size (23)
1246+
│ └── trailer [compression=snappy checksum=0x7caf143a]
1247+
├── meta-index offset: 845 length: 72
1248+
│ ├── 0000 pebble.value_index block:257/3 value-blocks-index-lengths: 1(num), 1(offset), 1(length)
1249+
│ │
1250+
│ ├── 0001 rocksdb.properties block:265/575
1251+
│ │
1252+
│ └── trailer [compression=none checksum=0xb9aeae4a]
1253+
└── footer offset: 922 length: 61
1254+
├── 000 checksum type: crc32c
1255+
├── 001 meta: offset=845, length=72
1256+
├── 004 index: offset=191, length=36
1257+
├── 041 attributes: [ValueBlocks]
1258+
├── 045 footer checksum: 0xca64ec92
1259+
├── 049 version: 7
1260+
└── 053 magic number: 0xf09faab3f09faab3
1261+
1262+
10541263
build table-format=Pebble,v7
10551264
b@5.SET.7:b5
10561265
b@3.SET.2:
@@ -1188,7 +1397,7 @@ sstable
11881397
├── 000 checksum type: crc32c
11891398
├── 001 meta: offset=676, length=46
11901399
├── 004 index: offset=105, length=36
1191-
├── 041 attributes: [ValueBlocks,RangeKeyUnsets,RangeDels,TwoLevelIndex]
1400+
├── 041 attributes: []
11921401
├── 045 footer checksum: 0xbcb59445
11931402
├── 049 version: 7
11941403
└── 053 magic number: 0xf09faab3f09faab3

0 commit comments

Comments
 (0)