vitess.io/vitess@v0.16.2/go/vt/mysqlctl/backup_test.go (about) 1 /* 2 Copyright 2019 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package mysqlctl 18 19 import ( 20 "os" 21 "path" 22 "reflect" 23 "sort" 24 "testing" 25 26 "vitess.io/vitess/go/mysql" 27 ) 28 29 func TestFindFilesToBackupWithoutRedoLog(t *testing.T) { 30 root := t.TempDir() 31 32 // Initialize the fake mysql root directories 33 innodbDataDir := path.Join(root, "innodb_data") 34 innodbLogDir := path.Join(root, "innodb_log") 35 dataDir := path.Join(root, "data") 36 dataDbDir := path.Join(dataDir, "vt_db") 37 extraDir := path.Join(dataDir, "extra_dir") 38 outsideDbDir := path.Join(root, "outside_db") 39 rocksdbDir := path.Join(dataDir, ".rocksdb") 40 sdiOnlyDir := path.Join(dataDir, "sdi_dir") 41 for _, s := range []string{innodbDataDir, innodbLogDir, dataDbDir, extraDir, outsideDbDir, rocksdbDir, sdiOnlyDir} { 42 if err := os.MkdirAll(s, os.ModePerm); err != nil { 43 t.Fatalf("failed to create directory %v: %v", s, err) 44 } 45 } 46 47 innodbLogFile := "innodb_log_1" 48 49 if err := os.WriteFile(path.Join(innodbDataDir, "innodb_data_1"), []byte("innodb data 1 contents"), os.ModePerm); err != nil { 50 t.Fatalf("failed to write file innodb_data_1: %v", err) 51 } 52 if err := os.WriteFile(path.Join(innodbLogDir, innodbLogFile), []byte("innodb log 1 contents"), os.ModePerm); err != nil { 53 t.Fatalf("failed to write file %s: %v", innodbLogFile, err) 54 } 55 if err := os.WriteFile(path.Join(dataDbDir, "db.opt"), []byte("db opt file"), os.ModePerm); err != nil { 56 t.Fatalf("failed to write file db.opt: %v", err) 57 } 58 if err := os.WriteFile(path.Join(extraDir, "extra.stuff"), []byte("extra file"), os.ModePerm); err != nil { 59 t.Fatalf("failed to write file extra.stuff: %v", err) 60 } 61 if err := os.WriteFile(path.Join(outsideDbDir, "table1.frm"), []byte("frm file"), os.ModePerm); err != nil { 62 t.Fatalf("failed to write file table1.opt: %v", err) 63 } 64 if err := os.Symlink(outsideDbDir, path.Join(dataDir, "vt_symlink")); err != nil { 65 t.Fatalf("failed to symlink vt_symlink: %v", err) 66 } 67 if err := os.WriteFile(path.Join(rocksdbDir, "000011.sst"), []byte("rocksdb file"), os.ModePerm); err != nil { 68 t.Fatalf("failed to write file 000011.sst: %v", err) 69 } 70 if err := os.WriteFile(path.Join(sdiOnlyDir, "table1.sdi"), []byte("sdi file"), os.ModePerm); err != nil { 71 t.Fatalf("failed to write file table1.sdi: %v", err) 72 } 73 74 cnf := &Mycnf{ 75 InnodbDataHomeDir: innodbDataDir, 76 InnodbLogGroupHomeDir: innodbLogDir, 77 DataDir: dataDir, 78 } 79 80 result, totalSize, err := findFilesToBackup(cnf) 81 if err != nil { 82 t.Fatalf("findFilesToBackup failed: %v", err) 83 } 84 sort.Sort(forTest(result)) 85 t.Logf("findFilesToBackup returned: %v", result) 86 expected := []FileEntry{ 87 { 88 Base: "Data", 89 Name: ".rocksdb/000011.sst", 90 }, 91 { 92 Base: "Data", 93 Name: "sdi_dir/table1.sdi", 94 }, 95 { 96 Base: "Data", 97 Name: "vt_db/db.opt", 98 }, 99 { 100 Base: "Data", 101 Name: "vt_symlink/table1.frm", 102 }, 103 { 104 Base: "InnoDBData", 105 Name: "innodb_data_1", 106 }, 107 { 108 Base: "InnoDBLog", 109 Name: innodbLogFile, 110 }, 111 } 112 if !reflect.DeepEqual(result, expected) { 113 t.Fatalf("got wrong list of FileEntry %v, expected %v", result, expected) 114 } 115 if totalSize <= 0 { 116 t.Fatalf("backup size should be > 0, got %v", totalSize) 117 } 118 } 119 120 func TestFindFilesToBackupWithRedoLog(t *testing.T) { 121 root := t.TempDir() 122 123 // Initialize the fake mysql root directories 124 innodbDataDir := path.Join(root, "innodb_data") 125 innodbLogDir := path.Join(root, "innodb_log") 126 dataDir := path.Join(root, "data") 127 dataDbDir := path.Join(dataDir, "vt_db") 128 extraDir := path.Join(dataDir, "extra_dir") 129 outsideDbDir := path.Join(root, "outside_db") 130 rocksdbDir := path.Join(dataDir, ".rocksdb") 131 sdiOnlyDir := path.Join(dataDir, "sdi_dir") 132 for _, s := range []string{innodbDataDir, innodbLogDir, dataDbDir, extraDir, outsideDbDir, rocksdbDir, sdiOnlyDir} { 133 if err := os.MkdirAll(s, os.ModePerm); err != nil { 134 t.Fatalf("failed to create directory %v: %v", s, err) 135 } 136 } 137 138 cnf := &Mycnf{ 139 InnodbDataHomeDir: innodbDataDir, 140 InnodbLogGroupHomeDir: innodbLogDir, 141 DataDir: dataDir, 142 } 143 144 os.Mkdir(path.Join(innodbLogDir, mysql.DynamicRedoLogSubdir), os.ModePerm) 145 innodbLogFile := path.Join(mysql.DynamicRedoLogSubdir, "#ib_redo1") 146 147 if err := os.WriteFile(path.Join(innodbDataDir, "innodb_data_1"), []byte("innodb data 1 contents"), os.ModePerm); err != nil { 148 t.Fatalf("failed to write file innodb_data_1: %v", err) 149 } 150 if err := os.WriteFile(path.Join(innodbLogDir, innodbLogFile), []byte("innodb log 1 contents"), os.ModePerm); err != nil { 151 t.Fatalf("failed to write file %s: %v", innodbLogFile, err) 152 } 153 if err := os.WriteFile(path.Join(dataDbDir, "db.opt"), []byte("db opt file"), os.ModePerm); err != nil { 154 t.Fatalf("failed to write file db.opt: %v", err) 155 } 156 if err := os.WriteFile(path.Join(extraDir, "extra.stuff"), []byte("extra file"), os.ModePerm); err != nil { 157 t.Fatalf("failed to write file extra.stuff: %v", err) 158 } 159 if err := os.WriteFile(path.Join(outsideDbDir, "table1.frm"), []byte("frm file"), os.ModePerm); err != nil { 160 t.Fatalf("failed to write file table1.opt: %v", err) 161 } 162 if err := os.Symlink(outsideDbDir, path.Join(dataDir, "vt_symlink")); err != nil { 163 t.Fatalf("failed to symlink vt_symlink: %v", err) 164 } 165 if err := os.WriteFile(path.Join(rocksdbDir, "000011.sst"), []byte("rocksdb file"), os.ModePerm); err != nil { 166 t.Fatalf("failed to write file 000011.sst: %v", err) 167 } 168 if err := os.WriteFile(path.Join(sdiOnlyDir, "table1.sdi"), []byte("sdi file"), os.ModePerm); err != nil { 169 t.Fatalf("failed to write file table1.sdi: %v", err) 170 } 171 172 result, totalSize, err := findFilesToBackup(cnf) 173 if err != nil { 174 t.Fatalf("findFilesToBackup failed: %v", err) 175 } 176 sort.Sort(forTest(result)) 177 t.Logf("findFilesToBackup returned: %v", result) 178 expected := []FileEntry{ 179 { 180 Base: "Data", 181 Name: ".rocksdb/000011.sst", 182 }, 183 { 184 Base: "Data", 185 Name: "sdi_dir/table1.sdi", 186 }, 187 { 188 Base: "Data", 189 Name: "vt_db/db.opt", 190 }, 191 { 192 Base: "Data", 193 Name: "vt_symlink/table1.frm", 194 }, 195 { 196 Base: "InnoDBData", 197 Name: "innodb_data_1", 198 }, 199 { 200 Base: "InnoDBLog", 201 Name: innodbLogFile, 202 }, 203 } 204 if !reflect.DeepEqual(result, expected) { 205 t.Fatalf("got wrong list of FileEntry %v, expected %v", result, expected) 206 } 207 if totalSize <= 0 { 208 t.Fatalf("backup size should be > 0, got %v", totalSize) 209 } 210 } 211 212 type forTest []FileEntry 213 214 func (f forTest) Len() int { return len(f) } 215 func (f forTest) Swap(i, j int) { f[i], f[j] = f[j], f[i] } 216 func (f forTest) Less(i, j int) bool { return f[i].Base+f[i].Name < f[j].Base+f[j].Name }