|
33 | 33 | --let $dirs= --innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir |
34 | 34 |
|
35 | 35 | perl; |
| 36 | +do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl"; |
36 | 37 | # Create a dummy system tablespace file using the default innodb_page_size=16k |
37 | 38 | die unless open OUT, ">", "$ENV{bugdir}/ibdata1"; |
38 | 39 | binmode OUT; |
39 | 40 |
|
| 41 | +# We calculate innodb_checksum_algorithm=crc32 for the pages. |
| 42 | +# The following bytes are excluded: |
| 43 | +# bytes 0..3 (the checksum is stored there) |
| 44 | +# bytes 26..37 (encryption key version, post-encryption checksum, tablespace id) |
| 45 | +# bytes $page_size-8..$page_size-1 (checksum, LSB of FIL_PAGE_LSN) |
| 46 | +my $polynomial = 0x82f63b78; # CRC-32C |
| 47 | + |
40 | 48 | # Tablespace header page with valid FSP_SIZE=768 pages. |
41 | 49 | # Also, write a dummy FSEG_MAGIC_N at offset 60 to keep fseg_inode_try_get() |
42 | 50 | # happy when fseg_n_reserved_pages() is following an invalid pointer |
43 | 51 | # from the all-zero change buffer header page (page 3). |
44 | | -print OUT pack("Nx[42]Nx[10]Nx[16312]Nx[4]", |
45 | | - 0xdeadbeef, # checksum |
46 | | - 768, # FSP_PAGE_SIZE |
47 | | - 97937874, # FSEG_MAGIC_N |
48 | | - 0xdeadbeef); # checksum |
| 52 | +## FIL_PAGE_OFFSET |
| 53 | +my $head = pack("Nx[18]", 0); |
| 54 | +## FSP_PAGE_SIZE, # FSEG_MAGIC_N |
| 55 | +my $body = pack("x[8]Nx[10]Nx[16312]", 768, 97937874); |
| 56 | +my $ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); |
| 57 | +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); |
49 | 58 | # Dummy pages 1..6. |
50 | 59 | print OUT chr(0) x (6 * 16384); |
51 | | -# Dictionary header page. |
52 | | -print OUT pack("NNx[62]Nx[8]Nx[16290]Nx[4]", |
53 | | - 0xdeadbeef, # checksum |
54 | | - 7, # FIL_PAGE_OFFSET |
55 | | - 8, # DICT_HDR_TABLES |
56 | | - 9, # DICT_HDR_INDEXES |
57 | | - 0xdeadbeef); # checksum |
| 60 | +# Dictionary header page (page 7). |
| 61 | +## FIL_PAGE_OFFSET |
| 62 | +$head = pack("Nx[18]", 7); |
| 63 | +## DICT_HDR_TABLES,DICT_HDR_INDEXES |
| 64 | +$body = pack("x[32]Nx[8]Nx[16290]", 8, 9); |
| 65 | +$ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); |
| 66 | +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); |
58 | 67 |
|
59 | 68 | # Empty SYS_TABLES page (page 8). |
60 | | -print OUT pack("NNNNx[8]nx[12]nnx[31]Cx[20]", |
61 | | - 0xdeadbeef, # checksum |
62 | | - 8, # FIL_PAGE_OFFSET |
63 | | - ~0, ~0, # FIL_PAGE_PREV, FIL_PAGE_NEXT |
64 | | - 17855, # FIL_PAGE_TYPE == FIL_PAGE_INDEX |
65 | | - 2, # PAGE_N_DIR_SLOTS |
66 | | - 124, # PAGE_HEAP_TOP |
67 | | - 1); # PAGE_INDEX_ID == DICT_TABLES_ID |
68 | | -print OUT pack("nxnn", 0x801, 3, 116), "infimum"; |
69 | | -print OUT pack("xnxnxx", 0x901, 0x803), "supremum"; |
70 | | -print OUT pack("x[16248]nnNx[4]", 116, 101, 0xdeadbeef); |
| 69 | +## FIL_PAGE_OFFSET, FIL_PAGE_PREV, FIL_PAGE_NEXT, FIL_PAGE_TYPE |
| 70 | +$head = pack("NNNx[8]n", 8, ~0, ~0, 17855); |
| 71 | +## PAGE_N_DIR_SLOTS, PAGE_HEAP_TOP, PAGE_INDEX_ID == DICT_TABLES_ID |
| 72 | +$body = pack("nnx[31]Cx[20]", 2, 124, 1); |
| 73 | +$body .= pack("nxnn", 0x801, 3, 116) . "infimum"; |
| 74 | +$body .= pack("xnxnxx", 0x901, 0x803) . "supremum"; |
| 75 | +$body .= pack("x[16248]nn", 116, 101); |
| 76 | +$ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); |
| 77 | +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); |
71 | 78 |
|
72 | 79 | # Empty SYS_INDEXES page (page 9). |
73 | | -print OUT pack("NNNNx[8]nx[12]nnx[31]Cx[20]", |
74 | | - 0xdeadbeef, # checksum |
75 | | - 9, # FIL_PAGE_OFFSET |
76 | | - ~0, ~0, # FIL_PAGE_PREV, FIL_PAGE_NEXT |
77 | | - 17855, # FIL_PAGE_TYPE == FIL_PAGE_INDEX |
78 | | - 2, # PAGE_N_DIR_SLOTS |
79 | | - 124, # PAGE_HEAP_TOP |
80 | | - 3); # PAGE_INDEX_ID == DICT_INDEXES_ID |
81 | | - |
82 | | -print OUT pack("nxnn", 0x801, 3, 116), "infimum"; |
83 | | -print OUT pack("xnxnxx", 0x901, 0x803), "supremum"; |
84 | | -print OUT pack("x[16248]nnNx[4]", 116, 101, 0xdeadbeef); |
| 80 | +## FIL_PAGE_OFFSET, FIL_PAGE_PREV, FIL_PAGE_NEXT, FIL_PAGE_TYPE |
| 81 | +$head = pack("NNNx[8]n", 9, ~0, ~0, 17855); |
| 82 | +## PAGE_N_DIR_SLOTS, PAGE_HEAP_TOP, PAGE_INDEX_ID == DICT_INDEXES_ID |
| 83 | +$body = pack("nnx[31]Cx[20]", 2, 124, 3); |
| 84 | +$body .= pack("nxnn", 0x801, 3, 116) . "infimum"; |
| 85 | +$body .= pack("xnxnxx", 0x901, 0x803) . "supremum"; |
| 86 | +$body .= pack("x[16248]nn", 116, 101); |
| 87 | +$ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); |
| 88 | +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); |
| 89 | + |
85 | 90 | print OUT chr(0) x (759 * 16384); |
86 | 91 | close OUT or die; |
87 | 92 |
|
|
0 commit comments