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 }