github.com/cockroachdb/pebble@v0.0.0-20231214172447-ab4952c5f87b/testdata/ingest_target_level (about) 1 define 2 ---- 3 4 # An empty LSM ingests into the bottom level. 5 target 6 a-b 7 ---- 8 6 9 10 define 11 L5 12 b.SET.1:1 13 c.SET.2:2 14 ---- 15 5: 16 000004:[b#1,SET-c#2,SET] 17 18 # Overlapping cases. 19 target 20 a-b 21 b-c 22 c-d 23 ---- 24 4 25 4 26 4 27 28 # Non-overlapping cases: 29 # - Ingested file lies entirely before the existing file. 30 # - Ingested file lies entirely after the existing file. 31 # - Ingested file has no data overlap (falls through the middle of the existing 32 # file). 33 target 34 a-aa 35 d-e 36 bb-bb 37 ---- 38 6 39 6 40 6 41 42 define 43 L0 44 b.SET.3:3 45 e.SET.4:4 46 L0 47 d.SET.5:5 48 f.SET.6:6 49 L0 50 x.SET.7:7 51 y.SET.8:8 52 L3 53 g.SET.1:1 54 h.SET.2:2 55 ---- 56 0.1: 57 000005:[d#5,SET-f#6,SET] 58 0.0: 59 000004:[b#3,SET-e#4,SET] 60 000006:[x#7,SET-y#8,SET] 61 3: 62 000007:[g#1,SET-h#2,SET] 63 64 # Files overlap with L0. Files ingested into L0. 65 target 66 b-c 67 d-e 68 ---- 69 0 70 0 71 72 # Files overlap with L3. Files ingested into L2. 73 target 74 g-m 75 ---- 76 2 77 78 # No overlap. Files ingested into L6. 79 target 80 i-m 81 c-c 82 ---- 83 6 84 6 85 86 define 87 L5 88 a.SET.4:4 89 L5 90 c.SET.3:3 91 L6 92 a.SET.2:2 93 L6 94 c.SET.1:1 95 ---- 96 5: 97 000004:[a#4,SET-a#4,SET] 98 000005:[c#3,SET-c#3,SET] 99 6: 100 000006:[a#2,SET-a#2,SET] 101 000007:[c#1,SET-c#1,SET] 102 103 # The ingested file slips through the gaps in both L5 and L6. 104 target 105 b-b 106 ---- 107 6 108 109 define 110 L5 111 a.SET.4:4 112 L5 113 c.SET.3:3 114 L6 115 a.SET.2:2 116 L6 117 c.SET.1:1 118 compact:a-c 119 ---- 120 5: 121 000004:[a#4,SET-a#4,SET] 122 000005:[c#3,SET-c#3,SET] 123 6: 124 000006:[a#2,SET-a#2,SET] 125 000007:[c#1,SET-c#1,SET] 126 127 # The ingested file cannot reach L6 as there is a compaction outputting a file 128 # into the range [a,c]. 129 target 130 b-b 131 ---- 132 5 133 134 define 135 L0 136 c.SET.4:4 137 d.SET.3:3 138 d.RANGEDEL.2:g 139 L2 140 a.RANGEDEL.1:g 141 ---- 142 0.0: 143 000004:[c#4,SET-g#inf,RANGEDEL] 144 2: 145 000005:[a#1,RANGEDEL-g#inf,RANGEDEL] 146 147 # Overlapping cases: 148 # - The ingested file overlaps with with [c,c]. 149 # - The rangedel over [d,g) keeps the ingested file in L0. 150 # - Ditto. 151 target 152 c-c 153 d-d 154 e-e 155 ---- 156 0 157 0 158 0 159 160 # Non-overlapping cases: 161 # - The ingested file [cc,cc] slips through L0, but is kept at L1 by the 162 # rangedel in L2. 163 # - The ingested file is to completely to right of all files. 164 # - The ingested file is to the left of all files in L0, but is kept at L1 by 165 # the rangedel in L2. 166 target 167 cc-cc 168 g-g 169 a-a 170 ---- 171 1 172 6 173 1 174 175 # A more complicated example demonstrating data overlap. 176 # |--| ingested file: [d-e] - data overlap 177 # |-| ingested file: [cc-d] - no data overlap 178 # |--| ingested file: [ee-ff] - no data overlap 179 # |*--*--*----*------*| existing file: [a-g], points: [a, b, c, dd, g] 180 # _____________________ 181 # a b c d e f g 182 define 183 L1 184 a.SET.0:a 185 b.SET.0:b 186 c.SET.0:c 187 dd.SET.0:dd 188 g.SET.0:g 189 ---- 190 1: 191 000004:[a#0,SET-g#0,SET] 192 193 # Data overlap. 194 target 195 d-e 196 ---- 197 0 198 199 # No data overlap. 200 target 201 cc-d 202 ee-ff 203 ---- 204 6 205 6 206 207 # Range key-point key data overlap will always correctly identify overlap because 208 # we seek using the combined point and range key bounds of the ingested file 209 # to determine overlap and don't check the data within the ingested file. 210 define 211 L5 212 a.SET.0:a 213 b.SET.0:b 214 c.SET.0:c 215 ---- 216 5: 217 000004:[a#0,SET-c#0,SET] 218 219 target 220 rkey:a-c 221 ---- 222 4 223 224 # Point key-range key overlap 225 define 226 L5 227 rangekey:a-c:{(#1,RANGEKEYSET,@t10,foo)} 228 ---- 229 5: 230 000004:[a#1,RANGEKEYSET-c#inf,RANGEKEYSET] 231 232 target 233 a-c 234 ---- 235 4 236 237 # Range key-range key overlap. 238 define 239 L5 240 rangekey:a-c:{(#1,RANGEKEYSET,@t10,foo)} 241 ---- 242 5: 243 000004:[a#1,RANGEKEYSET-c#inf,RANGEKEYSET] 244 245 target 246 rkey:a-c 247 ---- 248 4 249 250 # Cases with boundary overlap and no data overlap. With suggest-split off 251 # we get a target level of L0, but with suggest-split on, we get suggested 252 # a file split. 253 254 define 255 L6 256 a.SET.2:2 257 d.SET.3:3 258 L6 259 f.SET.4:4 260 k.SET.6:6 261 ---- 262 6: 263 000004:[a#2,SET-d#3,SET] 264 000005:[f#4,SET-k#6,SET] 265 266 target 267 b-c 268 e-g 269 ---- 270 5 271 5 272 273 target suggest-split 274 b-c 275 e-g 276 ---- 277 6 (split file: 000004) 278 5 279 280 target suggest-split 281 g-i 282 ---- 283 6 (split file: 000005) 284 285 # suggest-split recognizes and avoids in-progress compactions. 286 287 define 288 L6 289 a.SET.2:2 290 d.SET.3:3 291 L6 292 f.SET.4:4 293 k.SET.6:6 294 compact:f-k 295 ---- 296 6: 297 000004:[a#2,SET-d#3,SET] 298 000005:[f#4,SET-k#6,SET] 299 300 target suggest-split 301 g-i 302 ---- 303 5 304 305 # Ingestion splitting correctly recognizes data overlap in L6, and suggests 306 # split in L5. 307 308 define 309 L5 310 a.SET.2:2 311 e.SET.3:3 312 L6 313 c.SET.1:1 314 k.SET.1:1 315 ---- 316 5: 317 000004:[a#2,SET-e#3,SET] 318 6: 319 000005:[c#1,SET-k#1,SET] 320 321 target suggest-split 322 b-c 323 ---- 324 5 (split file: 000004)