diff --git a/config/mycnf/default-fast.cnf b/config/mycnf/default-fast.cnf index 3b732fdc6df..0046bad32a2 100644 --- a/config/mycnf/default-fast.cnf +++ b/config/mycnf/default-fast.cnf @@ -18,7 +18,7 @@ innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT innodb_lock_wait_timeout = 20 innodb_log_buffer_size = 1M -innodb_log_file_size = 1M +innodb_log_file_size = 4M innodb_log_files_in_group = 2 innodb_log_group_home_dir = {{.InnodbLogGroupHomeDir}} innodb_max_dirty_pages_pct = 75 diff --git a/go/vt/mysqlctl/backup.go b/go/vt/mysqlctl/backup.go index f97a7272451..474c78b9769 100644 --- a/go/vt/mysqlctl/backup.go +++ b/go/vt/mysqlctl/backup.go @@ -17,27 +17,17 @@ limitations under the License. package mysqlctl import ( - "bufio" - "encoding/json" "errors" "flag" "fmt" - "io" - "io/ioutil" "os" - "path" "path/filepath" "strings" - "sync" - "github.com/klauspost/pgzip" "golang.org/x/net/context" "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqlescape" - "vitess.io/vitess/go/sync2" - "vitess.io/vitess/go/vt/concurrency" - "vitess.io/vitess/go/vt/hook" "vitess.io/vitess/go/vt/log" "vitess.io/vitess/go/vt/logutil" "vitess.io/vitess/go/vt/mysqlctl/backupstorage" @@ -88,186 +78,6 @@ var ( backupCompressBlocks = flag.Int("backup_storage_number_blocks", 2, "if backup_storage_compress is true, backup_storage_number_blocks sets the number of blocks that can be processed, at once, before the writer blocks, during compression (default is 2). It should be equal to the number of CPUs available for compression") ) -// FileEntry is one file to backup -type FileEntry struct { - // Base is one of: - // - backupInnodbDataHomeDir for files that go into Mycnf.InnodbDataHomeDir - // - backupInnodbLogGroupHomeDir for files that go into Mycnf.InnodbLogGroupHomeDir - // - backupData for files that go into Mycnf.DataDir - Base string - - // Name is the file name, relative to Base - Name string - - // Hash is the hash of the final data (transformed and - // compressed if specified) stored in the BackupStorage. - Hash string -} - -func (fe *FileEntry) open(cnf *Mycnf, readOnly bool) (*os.File, error) { - // find the root to use - var root string - switch fe.Base { - case backupInnodbDataHomeDir: - root = cnf.InnodbDataHomeDir - case backupInnodbLogGroupHomeDir: - root = cnf.InnodbLogGroupHomeDir - case backupData: - root = cnf.DataDir - default: - return nil, fmt.Errorf("unknown base: %v", fe.Base) - } - - // and open the file - name := path.Join(root, fe.Name) - var fd *os.File - var err error - if readOnly { - fd, err = os.Open(name) - } else { - dir := path.Dir(name) - if err := os.MkdirAll(dir, os.ModePerm); err != nil { - return nil, fmt.Errorf("cannot create destination directory %v: %v", dir, err) - } - fd, err = os.Create(name) - } - if err != nil { - return nil, fmt.Errorf("cannot open source file %v: %v", name, err) - } - return fd, nil -} - -// BackupManifest represents the backup. It lists all the files, the -// Position that the backup was taken at, and the transform hook used, -// if any. -type BackupManifest struct { - // FileEntries contains all the files in the backup - FileEntries []FileEntry - - // Position is the position at which the backup was taken - Position mysql.Position - - // TransformHook that was used on the files, if any. - TransformHook string - - // SkipCompress can be set if the backup files were not run - // through gzip. It is the negative of the flag, so old - // backups that don't have this flag are assumed to be - // compressed. - SkipCompress bool -} - -// isDbDir returns true if the given directory contains a DB -func isDbDir(p string) bool { - // db.opt is there - if _, err := os.Stat(path.Join(p, "db.opt")); err == nil { - return true - } - - // Look for at least one database file - fis, err := ioutil.ReadDir(p) - if err != nil { - return false - } - for _, fi := range fis { - if strings.HasSuffix(fi.Name(), ".frm") { - return true - } - - // the MyRocks engine stores data in RocksDB .sst files - // https://github.com/facebook/rocksdb/wiki/Rocksdb-BlockBasedTable-Format - if strings.HasSuffix(fi.Name(), ".sst") { - return true - } - - // .frm files were removed in MySQL 8, so we need to check for two other file types - // https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html - if strings.HasSuffix(fi.Name(), ".ibd") { - return true - } - // https://dev.mysql.com/doc/refman/8.0/en/serialized-dictionary-information.html - if strings.HasSuffix(fi.Name(), ".sdi") { - return true - } - } - - return false -} - -func addDirectory(fes []FileEntry, base string, baseDir string, subDir string) ([]FileEntry, error) { - p := path.Join(baseDir, subDir) - - fis, err := ioutil.ReadDir(p) - if err != nil { - return nil, err - } - for _, fi := range fis { - fes = append(fes, FileEntry{ - Base: base, - Name: path.Join(subDir, fi.Name()), - }) - } - return fes, nil -} - -// addMySQL8DataDictionary checks to see if the new data dictionary introduced in MySQL 8 exists -// and adds it to the backup manifest if it does -// https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-transactional-storage.html -func addMySQL8DataDictionary(fes []FileEntry, base string, baseDir string) ([]FileEntry, error) { - const dataDictionaryFile = "mysql.ibd" - filePath := path.Join(baseDir, dataDictionaryFile) - - // no-op if this file doesn't exist - if _, err := os.Stat(filePath); os.IsNotExist(err) { - return fes, nil - } - - fes = append(fes, FileEntry{ - Base: base, - Name: dataDictionaryFile, - }) - - return fes, nil -} - -func findFilesToBackup(cnf *Mycnf) ([]FileEntry, error) { - var err error - var result []FileEntry - - // first add inno db files - result, err = addDirectory(result, backupInnodbDataHomeDir, cnf.InnodbDataHomeDir, "") - if err != nil { - return nil, err - } - result, err = addDirectory(result, backupInnodbLogGroupHomeDir, cnf.InnodbLogGroupHomeDir, "") - if err != nil { - return nil, err - } - - // then add the transactional data dictionary if it exists - result, err = addMySQL8DataDictionary(result, backupData, cnf.DataDir) - if err != nil { - return nil, err - } - - // then add DB directories - fis, err := ioutil.ReadDir(cnf.DataDir) - if err != nil { - return nil, err - } - - for _, fi := range fis { - p := path.Join(cnf.DataDir, fi.Name()) - if isDbDir(p) { - result, err = addDirectory(result, backupData, cnf.DataDir, fi.Name()) - if err != nil { - return nil, err - } - } - } - return result, nil -} - // Backup is the main entry point for a backup: // - uses the BackupStorage service to store a new backup // - shuts down Mysqld during the backup @@ -284,8 +94,13 @@ func Backup(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil. return fmt.Errorf("StartBackup failed: %v", err) } + be, err := GetBackupEngine() + if err != nil { + return fmt.Errorf("Failed to find backup engine: %v", err) + } + // Take the backup, and either AbortBackup or EndBackup. - usable, err := backup(ctx, cnf, mysqld, logger, bh, backupConcurrency, hookExtraEnv) + usable, err := be.ExecuteBackup(ctx, cnf, mysqld, logger, bh, backupConcurrency, hookExtraEnv) var finishErr error if usable { finishErr = bh.EndBackup(ctx) @@ -307,272 +122,6 @@ func Backup(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil. return finishErr } -// backup returns a boolean that indicates if the backup is usable, -// and an overall error. -func backup(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, backupConcurrency int, hookExtraEnv map[string]string) (bool, error) { - // Save initial state so we can restore. - slaveStartRequired := false - sourceIsMaster := false - readOnly := true - var replicationPosition mysql.Position - semiSyncMaster, semiSyncSlave := mysqld.SemiSyncEnabled() - - // See if we need to restart replication after backup. - logger.Infof("getting current replication status") - slaveStatus, err := mysqld.SlaveStatus() - switch err { - case nil: - slaveStartRequired = slaveStatus.SlaveRunning() - case mysql.ErrNotSlave: - // keep going if we're the master, might be a degenerate case - sourceIsMaster = true - default: - return false, fmt.Errorf("can't get slave status: %v", err) - } - - // get the read-only flag - readOnly, err = mysqld.IsReadOnly() - if err != nil { - return false, fmt.Errorf("can't get read-only status: %v", err) - } - - // get the replication position - if sourceIsMaster { - if !readOnly { - logger.Infof("turning master read-only before backup") - if err = mysqld.SetReadOnly(true); err != nil { - return false, fmt.Errorf("can't set read-only status: %v", err) - } - } - replicationPosition, err = mysqld.MasterPosition() - if err != nil { - return false, fmt.Errorf("can't get master position: %v", err) - } - } else { - if err = mysqld.StopSlave(hookExtraEnv); err != nil { - return false, fmt.Errorf("can't stop slave: %v", err) - } - var slaveStatus mysql.SlaveStatus - slaveStatus, err = mysqld.SlaveStatus() - if err != nil { - return false, fmt.Errorf("can't get slave status: %v", err) - } - replicationPosition = slaveStatus.Position - } - logger.Infof("using replication position: %v", replicationPosition) - - // shutdown mysqld - err = mysqld.Shutdown(ctx, cnf, true) - if err != nil { - return false, fmt.Errorf("can't shutdown mysqld: %v", err) - } - - // Backup everything, capture the error. - backupErr := backupFiles(ctx, cnf, mysqld, logger, bh, replicationPosition, backupConcurrency, hookExtraEnv) - usable := backupErr == nil - - // Try to restart mysqld - err = mysqld.Start(ctx, cnf) - if err != nil { - return usable, fmt.Errorf("can't restart mysqld: %v", err) - } - - // Restore original mysqld state that we saved above. - if semiSyncMaster || semiSyncSlave { - // Only do this if one of them was on, since both being off could mean - // the plugin isn't even loaded, and the server variables don't exist. - logger.Infof("restoring semi-sync settings from before backup: master=%v, slave=%v", - semiSyncMaster, semiSyncSlave) - err := mysqld.SetSemiSyncEnabled(semiSyncMaster, semiSyncSlave) - if err != nil { - return usable, err - } - } - if slaveStartRequired { - logger.Infof("restarting mysql replication") - if err := mysqld.StartSlave(hookExtraEnv); err != nil { - return usable, fmt.Errorf("cannot restart slave: %v", err) - } - - // this should be quick, but we might as well just wait - if err := WaitForSlaveStart(mysqld, slaveStartDeadline); err != nil { - return usable, fmt.Errorf("slave is not restarting: %v", err) - } - } - - // And set read-only mode - logger.Infof("resetting mysqld read-only to %v", readOnly) - if err := mysqld.SetReadOnly(readOnly); err != nil { - return usable, err - } - - return usable, backupErr -} - -// backupFiles finds the list of files to backup, and creates the backup. -func backupFiles(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, replicationPosition mysql.Position, backupConcurrency int, hookExtraEnv map[string]string) (err error) { - // Get the files to backup. - fes, err := findFilesToBackup(cnf) - if err != nil { - return fmt.Errorf("can't find files to backup: %v", err) - } - logger.Infof("found %v files to backup", len(fes)) - - // Backup with the provided concurrency. - sema := sync2.NewSemaphore(backupConcurrency, 0) - rec := concurrency.AllErrorRecorder{} - wg := sync.WaitGroup{} - for i := range fes { - wg.Add(1) - go func(i int) { - defer wg.Done() - - // Wait until we are ready to go, skip if we already - // encountered an error. - sema.Acquire() - defer sema.Release() - if rec.HasErrors() { - return - } - - // Backup the individual file. - name := fmt.Sprintf("%v", i) - rec.RecordError(backupFile(ctx, cnf, mysqld, logger, bh, &fes[i], name, hookExtraEnv)) - }(i) - } - - wg.Wait() - if rec.HasErrors() { - return rec.Error() - } - - // open the MANIFEST - wc, err := bh.AddFile(ctx, backupManifest, 0) - if err != nil { - return fmt.Errorf("cannot add %v to backup: %v", backupManifest, err) - } - defer func() { - if closeErr := wc.Close(); err == nil { - err = closeErr - } - }() - - // JSON-encode and write the MANIFEST - bm := &BackupManifest{ - FileEntries: fes, - Position: replicationPosition, - TransformHook: *backupStorageHook, - SkipCompress: !*backupStorageCompress, - } - data, err := json.MarshalIndent(bm, "", " ") - if err != nil { - return fmt.Errorf("cannot JSON encode %v: %v", backupManifest, err) - } - if _, err := wc.Write([]byte(data)); err != nil { - return fmt.Errorf("cannot write %v: %v", backupManifest, err) - } - - return nil -} - -// backupFile backs up an individual file. -func backupFile(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, fe *FileEntry, name string, hookExtraEnv map[string]string) (err error) { - // Open the source file for reading. - var source *os.File - source, err = fe.open(cnf, true) - if err != nil { - return err - } - defer source.Close() - - fi, err := source.Stat() - if err != nil { - return err - } - - // Open the destination file for writing, and a buffer. - wc, err := bh.AddFile(ctx, name, fi.Size()) - if err != nil { - return fmt.Errorf("cannot add file: %v", err) - } - defer func() { - if rerr := wc.Close(); rerr != nil { - if err != nil { - // We already have an error, just log this one. - logger.Errorf2(rerr, "failed to close file %v", name) - } else { - err = rerr - } - } - }() - dst := bufio.NewWriterSize(wc, 2*1024*1024) - - // Create the hasher and the tee on top. - hasher := newHasher() - writer := io.MultiWriter(dst, hasher) - - // Create the external write pipe, if any. - var pipe io.WriteCloser - var wait hook.WaitFunc - if *backupStorageHook != "" { - h := hook.NewHook(*backupStorageHook, []string{"-operation", "write"}) - h.ExtraEnv = hookExtraEnv - pipe, wait, _, err = h.ExecuteAsWritePipe(writer) - if err != nil { - return fmt.Errorf("'%v' hook returned error: %v", *backupStorageHook, err) - } - writer = pipe - } - - // Create the gzip compression pipe, if necessary. - var gzip *pgzip.Writer - if *backupStorageCompress { - gzip, err = pgzip.NewWriterLevel(writer, pgzip.BestSpeed) - if err != nil { - return fmt.Errorf("cannot create gziper: %v", err) - } - gzip.SetConcurrency(*backupCompressBlockSize, *backupCompressBlocks) - writer = gzip - } - - // Copy from the source file to writer (optional gzip, - // optional pipe, tee, output file and hasher). - _, err = io.Copy(writer, source) - if err != nil { - return fmt.Errorf("cannot copy data: %v", err) - } - - // Close gzip to flush it, after that all data is sent to writer. - if gzip != nil { - if err = gzip.Close(); err != nil { - return fmt.Errorf("cannot close gzip: %v", err) - } - } - - // Close the hook pipe if necessary. - if pipe != nil { - if err := pipe.Close(); err != nil { - return fmt.Errorf("cannot close hook pipe: %v", err) - } - stderr, err := wait() - if stderr != "" { - logger.Infof("'%v' hook returned stderr: %v", *backupStorageHook, stderr) - } - if err != nil { - return fmt.Errorf("'%v' returned error: %v", *backupStorageHook, err) - } - } - - // Flush the buffer to finish writing on destination. - if err = dst.Flush(); err != nil { - return fmt.Errorf("cannot flush dst: %v", err) - } - - // Save the hash. - fe.Hash = hasher.HashString() - return nil -} - // checkNoDB makes sure there is no user data already there. // Used by Restore, as we do not want to destroy an existing DB. // The user's database name must be given since we ignore all others. @@ -606,126 +155,6 @@ func checkNoDB(ctx context.Context, mysqld MysqlDaemon, dbName string) (bool, er return true, nil } -// restoreFiles will copy all the files from the BackupStorage to the -// right place. -func restoreFiles(ctx context.Context, cnf *Mycnf, bh backupstorage.BackupHandle, fes []FileEntry, transformHook string, compress bool, restoreConcurrency int, hookExtraEnv map[string]string) error { - sema := sync2.NewSemaphore(restoreConcurrency, 0) - rec := concurrency.AllErrorRecorder{} - wg := sync.WaitGroup{} - for i := range fes { - wg.Add(1) - go func(i int) { - defer wg.Done() - - // Wait until we are ready to go, skip if we already - // encountered an error. - sema.Acquire() - defer sema.Release() - if rec.HasErrors() { - return - } - - // And restore the file. - name := fmt.Sprintf("%v", i) - rec.RecordError(restoreFile(ctx, cnf, bh, &fes[i], transformHook, compress, name, hookExtraEnv)) - }(i) - } - wg.Wait() - return rec.Error() -} - -// restoreFile restores an individual file. -func restoreFile(ctx context.Context, cnf *Mycnf, bh backupstorage.BackupHandle, fe *FileEntry, transformHook string, compress bool, name string, hookExtraEnv map[string]string) (err error) { - // Open the source file for reading. - var source io.ReadCloser - source, err = bh.ReadFile(ctx, name) - if err != nil { - return err - } - defer source.Close() - - // Open the destination file for writing. - dstFile, err := fe.open(cnf, false) - if err != nil { - return err - } - defer func() { - if cerr := dstFile.Close(); cerr != nil { - if err != nil { - // We already have an error, just log this one. - log.Errorf("failed to close file %v: %v", name, cerr) - } else { - err = cerr - } - } - }() - - // Create a buffering output. - dst := bufio.NewWriterSize(dstFile, 2*1024*1024) - - // Create hash to write the compressed data to. - hasher := newHasher() - - // Create a Tee: we split the input into the hasher - // and into the gunziper. - reader := io.TeeReader(source, hasher) - - // Create the external read pipe, if any. - var wait hook.WaitFunc - if transformHook != "" { - h := hook.NewHook(transformHook, []string{"-operation", "read"}) - h.ExtraEnv = hookExtraEnv - reader, wait, _, err = h.ExecuteAsReadPipe(reader) - if err != nil { - return fmt.Errorf("'%v' hook returned error: %v", transformHook, err) - } - } - - // Create the uncompresser if needed. - if compress { - gz, err := pgzip.NewReader(reader) - if err != nil { - return err - } - defer func() { - if cerr := gz.Close(); cerr != nil { - if err != nil { - // We already have an error, just log this one. - log.Errorf("failed to close gunziper %v: %v", name, cerr) - } else { - err = cerr - } - } - }() - reader = gz - } - - // Copy the data. Will also write to the hasher. - if _, err = io.Copy(dst, reader); err != nil { - return err - } - - // Close the Pipe. - if wait != nil { - stderr, err := wait() - if stderr != "" { - log.Infof("'%v' hook returned stderr: %v", transformHook, stderr) - } - if err != nil { - return fmt.Errorf("'%v' returned error: %v", transformHook, err) - } - } - - // Check the hash. - hash := hasher.HashString() - if hash != fe.Hash { - return fmt.Errorf("hash mismatch for %v, got %v expected %v", fe.Name, hash, fe.Hash) - } - - // Flush the buffer. - return dst.Flush() -} - // removeExistingFiles will delete existing files in the data dir to prevent // conflicts with the restored archive. In particular, binlogs can be created // even during initial bootstrap, and these can interfere with configuring @@ -790,6 +219,8 @@ func Restore( deleteBeforeRestore bool, dbName string) (mysql.Position, error) { + rval := mysql.Position{} + // Wait for mysqld to be ready, in case it was launched in parallel with us. if err := mysqld.Wait(ctx, cnf); err != nil { return mysql.Position{}, err @@ -826,7 +257,7 @@ func Restore( if len(bhs) == 0 { // There are no backups (not even broken/incomplete ones). logger.Errorf("No backup to restore on BackupStorage for directory %v. Starting up empty.", dir) - // Since this Was an empty database make sure we start replication at the beginning + // Since this is an empty database make sure we start replication at the beginning if err = mysqld.ResetReplication(ctx); err == nil { logger.Errorf("Error reseting slave replication: %v. Continuing", err) err = ErrNoBackup @@ -838,57 +269,12 @@ func Restore( return mysql.Position{}, err } - var bh backupstorage.BackupHandle - var bm BackupManifest - var toRestore int - for toRestore = len(bhs) - 1; toRestore >= 0; toRestore-- { - bh = bhs[toRestore] - rc, err := bh.ReadFile(ctx, backupManifest) - if err != nil { - log.Warningf("Possibly incomplete backup %v in directory %v on BackupStorage: can't read MANIFEST: %v)", bh.Name(), dir, err) - continue - } - - err = json.NewDecoder(rc).Decode(&bm) - rc.Close() - if err != nil { - log.Warningf("Possibly incomplete backup %v in directory %v on BackupStorage (cannot JSON decode MANIFEST: %v)", bh.Name(), dir, err) - continue - } - - logger.Infof("Restore: found backup %v %v to restore with %v files", bh.Directory(), bh.Name(), len(bm.FileEntries)) - break - } - if toRestore < 0 { - // There is at least one attempted backup, but none could be read. - // This implies there is data we ought to have, so it's not safe to start - // up empty. - return mysql.Position{}, errors.New("backup(s) found but none could be read, unsafe to start up empty, restart to retry restore") - } - - // Starting from here we won't be able to recover if we get stopped by a cancelled - // context. Thus we use the background context to get through to the finish. - - logger.Infof("Restore: shutdown mysqld") - err = mysqld.Shutdown(context.Background(), cnf, true) + be, err := GetBackupEngine() if err != nil { - return mysql.Position{}, err - } - - logger.Infof("Restore: deleting existing files") - if err := removeExistingFiles(cnf); err != nil { - return mysql.Position{}, err + return mysql.Position{}, fmt.Errorf("Failed to find backup engine: %v", err) } - - logger.Infof("Restore: reinit config file") - err = mysqld.ReinitConfig(context.Background(), cnf) - if err != nil { - return mysql.Position{}, err - } - - logger.Infof("Restore: copying all files") - if err := restoreFiles(context.Background(), cnf, bh, bm.FileEntries, bm.TransformHook, !bm.SkipCompress, restoreConcurrency, hookExtraEnv); err != nil { - return mysql.Position{}, err + if rval, err = be.ExecuteRestore(ctx, cnf, mysqld, logger, dir, bhs, restoreConcurrency, hookExtraEnv); err != nil { + return rval, err } // mysqld needs to be running in order for mysql_upgrade to work. @@ -930,5 +316,5 @@ func Restore( return mysql.Position{}, err } - return bm.Position, nil + return rval, nil } diff --git a/go/vt/mysqlctl/backupengine.go b/go/vt/mysqlctl/backupengine.go new file mode 100644 index 00000000000..c793a0493bb --- /dev/null +++ b/go/vt/mysqlctl/backupengine.go @@ -0,0 +1,52 @@ +/* +Copyright 2019 The Vitess Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mysqlctl + +import ( + "context" + "flag" + "fmt" + + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/vt/logutil" + "vitess.io/vitess/go/vt/mysqlctl/backupstorage" +) + +var ( + // BackupEngineImplementation is the implementation to use + // for BackupEngine. Exported for test purposes. + BackupEngineImplementation = flag.String("backup_engine_implementation", "builtin", "which implementation to use for the backup storage engine") +) + +// BackupEngine is the interface to the backup engine +type BackupEngine interface { + ExecuteBackup(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, backupConcurrency int, hookExtraEnv map[string]string) (bool, error) + ExecuteRestore(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, dir string, bhs []backupstorage.BackupHandle, restoreConcurrency int, hookExtraEnv map[string]string) (mysql.Position, error) +} + +// BackupEngineMap contains the registered implementations for BackupEngine +var BackupEngineMap = make(map[string]BackupEngine) + +// GetBackupEngine returns the current BackupEngine implementation. +// Should be called after flags have been initialized. +func GetBackupEngine() (BackupEngine, error) { + be, ok := BackupEngineMap[*BackupEngineImplementation] + if !ok { + return nil, fmt.Errorf("no registered implementation of BackupEngine") + } + return be, nil +} diff --git a/go/vt/mysqlctl/builtinbackupengine.go b/go/vt/mysqlctl/builtinbackupengine.go new file mode 100644 index 00000000000..38a23b85d4f --- /dev/null +++ b/go/vt/mysqlctl/builtinbackupengine.go @@ -0,0 +1,691 @@ +/* +Copyright 2019 The Vitess Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mysqlctl + +import ( + "bufio" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "strings" + "sync" + + "github.com/klauspost/pgzip" + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/sync2" + "vitess.io/vitess/go/vt/concurrency" + "vitess.io/vitess/go/vt/hook" + "vitess.io/vitess/go/vt/log" + "vitess.io/vitess/go/vt/logutil" + "vitess.io/vitess/go/vt/mysqlctl/backupstorage" +) + +// BuiltinBackupEngine encapsulates the logic of the builtin engine +// it implements the BackupEngine interface and contains all the logic +// required to implement a backup/restore by copying files from and to +// the correct location / storage bucket +type BuiltinBackupEngine struct { +} + +// BackupManifest represents the backup. It lists all the files, the +// Position that the backup was taken at, and the transform hook used, +// if any. +type BackupManifest struct { + // FileEntries contains all the files in the backup + FileEntries []FileEntry + + // Position is the position at which the backup was taken + Position mysql.Position + + // TransformHook that was used on the files, if any. + TransformHook string + + // SkipCompress can be set if the backup files were not run + // through gzip. It is the negative of the flag, so old + // backups that don't have this flag are assumed to be + // compressed. + SkipCompress bool +} + +// FileEntry is one file to backup +type FileEntry struct { + // Base is one of: + // - backupInnodbDataHomeDir for files that go into Mycnf.InnodbDataHomeDir + // - backupInnodbLogGroupHomeDir for files that go into Mycnf.InnodbLogGroupHomeDir + // - backupData for files that go into Mycnf.DataDir + Base string + + // Name is the file name, relative to Base + Name string + + // Hash is the hash of the final data (transformed and + // compressed if specified) stored in the BackupStorage. + Hash string +} + +func (fe *FileEntry) open(cnf *Mycnf, readOnly bool) (*os.File, error) { + // find the root to use + var root string + switch fe.Base { + case backupInnodbDataHomeDir: + root = cnf.InnodbDataHomeDir + case backupInnodbLogGroupHomeDir: + root = cnf.InnodbLogGroupHomeDir + case backupData: + root = cnf.DataDir + default: + return nil, fmt.Errorf("unknown base: %v", fe.Base) + } + + // and open the file + name := path.Join(root, fe.Name) + var fd *os.File + var err error + if readOnly { + if fd, err = os.Open(name); err != nil { + return nil, fmt.Errorf("cannot open source file %v: %v", name, err) + } + } else { + dir := path.Dir(name) + if err := os.MkdirAll(dir, os.ModePerm); err != nil { + return nil, fmt.Errorf("cannot create destination directory %v: %v", dir, err) + } + if fd, err = os.Create(name); err != nil { + return nil, fmt.Errorf("cannot create destination file %v: %v", name, err) + } + } + return fd, nil +} + +// isDbDir returns true if the given directory contains a DB +func isDbDir(p string) bool { + // db.opt is there + if _, err := os.Stat(path.Join(p, "db.opt")); err == nil { + return true + } + + // Look for at least one database file + fis, err := ioutil.ReadDir(p) + if err != nil { + return false + } + for _, fi := range fis { + if strings.HasSuffix(fi.Name(), ".frm") { + return true + } + + // the MyRocks engine stores data in RocksDB .sst files + // https://github.com/facebook/rocksdb/wiki/Rocksdb-BlockBasedTable-Format + if strings.HasSuffix(fi.Name(), ".sst") { + return true + } + + // .frm files were removed in MySQL 8, so we need to check for two other file types + // https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html + if strings.HasSuffix(fi.Name(), ".ibd") { + return true + } + // https://dev.mysql.com/doc/refman/8.0/en/serialized-dictionary-information.html + if strings.HasSuffix(fi.Name(), ".sdi") { + return true + } + } + + return false +} + +func addDirectory(fes []FileEntry, base string, baseDir string, subDir string) ([]FileEntry, error) { + p := path.Join(baseDir, subDir) + + fis, err := ioutil.ReadDir(p) + if err != nil { + return nil, err + } + for _, fi := range fis { + fes = append(fes, FileEntry{ + Base: base, + Name: path.Join(subDir, fi.Name()), + }) + } + return fes, nil +} + +// addMySQL8DataDictionary checks to see if the new data dictionary introduced in MySQL 8 exists +// and adds it to the backup manifest if it does +// https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-transactional-storage.html +func addMySQL8DataDictionary(fes []FileEntry, base string, baseDir string) ([]FileEntry, error) { + const dataDictionaryFile = "mysql.ibd" + filePath := path.Join(baseDir, dataDictionaryFile) + + // no-op if this file doesn't exist + if _, err := os.Stat(filePath); os.IsNotExist(err) { + return fes, nil + } + + fes = append(fes, FileEntry{ + Base: base, + Name: dataDictionaryFile, + }) + + return fes, nil +} + +func findFilesToBackup(cnf *Mycnf) ([]FileEntry, error) { + var err error + var result []FileEntry + + // first add inno db files + result, err = addDirectory(result, backupInnodbDataHomeDir, cnf.InnodbDataHomeDir, "") + if err != nil { + return nil, err + } + result, err = addDirectory(result, backupInnodbLogGroupHomeDir, cnf.InnodbLogGroupHomeDir, "") + if err != nil { + return nil, err + } + + // then add the transactional data dictionary if it exists + result, err = addMySQL8DataDictionary(result, backupData, cnf.DataDir) + if err != nil { + return nil, err + } + + // then add DB directories + fis, err := ioutil.ReadDir(cnf.DataDir) + if err != nil { + return nil, err + } + + for _, fi := range fis { + p := path.Join(cnf.DataDir, fi.Name()) + if isDbDir(p) { + result, err = addDirectory(result, backupData, cnf.DataDir, fi.Name()) + if err != nil { + return nil, err + } + } + } + return result, nil +} + +// ExecuteBackup returns a boolean that indicates if the backup is usable, +// and an overall error. +func (be *BuiltinBackupEngine) ExecuteBackup(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, backupConcurrency int, hookExtraEnv map[string]string) (bool, error) { + + logger.Infof("Hook: %v, Compress: %v", *backupStorageHook, *backupStorageCompress) + + // Save initial state so we can restore. + slaveStartRequired := false + sourceIsMaster := false + readOnly := true + var replicationPosition mysql.Position + semiSyncMaster, semiSyncSlave := mysqld.SemiSyncEnabled() + + // See if we need to restart replication after backup. + logger.Infof("getting current replication status") + slaveStatus, err := mysqld.SlaveStatus() + switch err { + case nil: + slaveStartRequired = slaveStatus.SlaveRunning() + case mysql.ErrNotSlave: + // keep going if we're the master, might be a degenerate case + sourceIsMaster = true + default: + return false, fmt.Errorf("can't get slave status: %v", err) + } + + // get the read-only flag + readOnly, err = mysqld.IsReadOnly() + if err != nil { + return false, fmt.Errorf("can't get read-only status: %v", err) + } + + // get the replication position + if sourceIsMaster { + if !readOnly { + logger.Infof("turning master read-only before backup") + if err = mysqld.SetReadOnly(true); err != nil { + return false, fmt.Errorf("can't set read-only status: %v", err) + } + } + replicationPosition, err = mysqld.MasterPosition() + if err != nil { + return false, fmt.Errorf("can't get master position: %v", err) + } + } else { + if err = mysqld.StopSlave(hookExtraEnv); err != nil { + return false, fmt.Errorf("can't stop slave: %v", err) + } + var slaveStatus mysql.SlaveStatus + slaveStatus, err = mysqld.SlaveStatus() + if err != nil { + return false, fmt.Errorf("can't get slave status: %v", err) + } + replicationPosition = slaveStatus.Position + } + logger.Infof("using replication position: %v", replicationPosition) + + // shutdown mysqld + err = mysqld.Shutdown(ctx, cnf, true) + if err != nil { + return false, fmt.Errorf("can't shutdown mysqld: %v", err) + } + + // Backup everything, capture the error. + backupErr := be.backupFiles(ctx, cnf, mysqld, logger, bh, replicationPosition, backupConcurrency, hookExtraEnv) + usable := backupErr == nil + + // Try to restart mysqld + err = mysqld.Start(ctx, cnf) + if err != nil { + return usable, fmt.Errorf("can't restart mysqld: %v", err) + } + + // Restore original mysqld state that we saved above. + if semiSyncMaster || semiSyncSlave { + // Only do this if one of them was on, since both being off could mean + // the plugin isn't even loaded, and the server variables don't exist. + logger.Infof("restoring semi-sync settings from before backup: master=%v, slave=%v", + semiSyncMaster, semiSyncSlave) + err := mysqld.SetSemiSyncEnabled(semiSyncMaster, semiSyncSlave) + if err != nil { + return usable, err + } + } + if slaveStartRequired { + logger.Infof("restarting mysql replication") + if err := mysqld.StartSlave(hookExtraEnv); err != nil { + return usable, fmt.Errorf("cannot restart slave: %v", err) + } + + // this should be quick, but we might as well just wait + if err := WaitForSlaveStart(mysqld, slaveStartDeadline); err != nil { + return usable, fmt.Errorf("slave is not restarting: %v", err) + } + } + + // And set read-only mode + logger.Infof("resetting mysqld read-only to %v", readOnly) + if err := mysqld.SetReadOnly(readOnly); err != nil { + return usable, err + } + + return usable, backupErr +} + +// backupFiles finds the list of files to backup, and creates the backup. +func (be *BuiltinBackupEngine) backupFiles(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, replicationPosition mysql.Position, backupConcurrency int, hookExtraEnv map[string]string) (err error) { + // Get the files to backup. + fes, err := findFilesToBackup(cnf) + if err != nil { + return fmt.Errorf("can't find files to backup: %v", err) + } + logger.Infof("found %v files to backup", len(fes)) + + // Backup with the provided concurrency. + sema := sync2.NewSemaphore(backupConcurrency, 0) + rec := concurrency.AllErrorRecorder{} + wg := sync.WaitGroup{} + for i := range fes { + wg.Add(1) + go func(i int) { + defer wg.Done() + + // Wait until we are ready to go, skip if we already + // encountered an error. + sema.Acquire() + defer sema.Release() + if rec.HasErrors() { + return + } + + // Backup the individual file. + name := fmt.Sprintf("%v", i) + rec.RecordError(be.backupFile(ctx, cnf, mysqld, logger, bh, &fes[i], name, hookExtraEnv)) + }(i) + } + + wg.Wait() + if rec.HasErrors() { + return rec.Error() + } + + // open the MANIFEST + wc, err := bh.AddFile(ctx, backupManifest, 0) + if err != nil { + return fmt.Errorf("cannot add %v to backup: %v", backupManifest, err) + } + defer func() { + if closeErr := wc.Close(); err == nil { + err = closeErr + } + }() + + // JSON-encode and write the MANIFEST + bm := &BackupManifest{ + FileEntries: fes, + Position: replicationPosition, + TransformHook: *backupStorageHook, + SkipCompress: !*backupStorageCompress, + } + data, err := json.MarshalIndent(bm, "", " ") + if err != nil { + return fmt.Errorf("cannot JSON encode %v: %v", backupManifest, err) + } + if _, err := wc.Write([]byte(data)); err != nil { + return fmt.Errorf("cannot write %v: %v", backupManifest, err) + } + + return nil +} + +// backupFile backs up an individual file. +func (be *BuiltinBackupEngine) backupFile(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, fe *FileEntry, name string, hookExtraEnv map[string]string) (err error) { + // Open the source file for reading. + var source *os.File + source, err = fe.open(cnf, true) + if err != nil { + return err + } + defer source.Close() + + fi, err := source.Stat() + if err != nil { + return err + } + + // Open the destination file for writing, and a buffer. + wc, err := bh.AddFile(ctx, name, fi.Size()) + if err != nil { + return fmt.Errorf("cannot add file: %v", err) + } + defer func() { + if rerr := wc.Close(); rerr != nil { + if err != nil { + // We already have an error, just log this one. + logger.Errorf2(rerr, "failed to close file %v", name) + } else { + err = rerr + } + } + }() + dst := bufio.NewWriterSize(wc, 2*1024*1024) + + // Create the hasher and the tee on top. + hasher := newHasher() + writer := io.MultiWriter(dst, hasher) + + // Create the external write pipe, if any. + var pipe io.WriteCloser + var wait hook.WaitFunc + if *backupStorageHook != "" { + h := hook.NewHook(*backupStorageHook, []string{"-operation", "write"}) + h.ExtraEnv = hookExtraEnv + pipe, wait, _, err = h.ExecuteAsWritePipe(writer) + if err != nil { + return fmt.Errorf("'%v' hook returned error: %v", *backupStorageHook, err) + } + writer = pipe + } + + // Create the gzip compression pipe, if necessary. + var gzip *pgzip.Writer + if *backupStorageCompress { + gzip, err = pgzip.NewWriterLevel(writer, pgzip.BestSpeed) + if err != nil { + return fmt.Errorf("cannot create gziper: %v", err) + } + gzip.SetConcurrency(*backupCompressBlockSize, *backupCompressBlocks) + writer = gzip + } + + // Copy from the source file to writer (optional gzip, + // optional pipe, tee, output file and hasher). + _, err = io.Copy(writer, source) + if err != nil { + return fmt.Errorf("cannot copy data: %v", err) + } + + // Close gzip to flush it, after that all data is sent to writer. + if gzip != nil { + if err = gzip.Close(); err != nil { + return fmt.Errorf("cannot close gzip: %v", err) + } + } + + // Close the hook pipe if necessary. + if pipe != nil { + if err := pipe.Close(); err != nil { + return fmt.Errorf("cannot close hook pipe: %v", err) + } + stderr, err := wait() + if stderr != "" { + logger.Infof("'%v' hook returned stderr: %v", *backupStorageHook, stderr) + } + if err != nil { + return fmt.Errorf("'%v' returned error: %v", *backupStorageHook, err) + } + } + + // Flush the buffer to finish writing on destination. + if err = dst.Flush(); err != nil { + return fmt.Errorf("cannot flush dst: %v", err) + } + + // Save the hash. + fe.Hash = hasher.HashString() + return nil +} + +// ExecuteRestore restores from a backup. If the restore is successful +// we return the position from which replication should start +// otherwise an error is returned +func (be *BuiltinBackupEngine) ExecuteRestore( + ctx context.Context, + cnf *Mycnf, + mysqld MysqlDaemon, + logger logutil.Logger, + dir string, + bhs []backupstorage.BackupHandle, + restoreConcurrency int, + hookExtraEnv map[string]string) (mysql.Position, error) { + + var bh backupstorage.BackupHandle + var bm BackupManifest + var toRestore int + + for toRestore = len(bhs) - 1; toRestore >= 0; toRestore-- { + bh = bhs[toRestore] + rc, err := bh.ReadFile(ctx, backupManifest) + if err != nil { + log.Warningf("Possibly incomplete backup %v in directory %v on BackupStorage: can't read MANIFEST: %v)", bh.Name(), dir, err) + continue + } + + err = json.NewDecoder(rc).Decode(&bm) + rc.Close() + if err != nil { + log.Warningf("Possibly incomplete backup %v in directory %v on BackupStorage (cannot JSON decode MANIFEST: %v)", bh.Name(), dir, err) + continue + } + + logger.Infof("Restore: found backup %v %v to restore with %v files", bh.Directory(), bh.Name(), len(bm.FileEntries)) + break + } + if toRestore < 0 { + // There is at least one attempted backup, but none could be read. + // This implies there is data we ought to have, so it's not safe to start + // up empty. + return mysql.Position{}, errors.New("backup(s) found but none could be read, unsafe to start up empty, restart to retry restore") + } + + // Starting from here we won't be able to recover if we get stopped by a cancelled + // context. Thus we use the background context to get through to the finish. + + logger.Infof("Restore: shutdown mysqld") + err := mysqld.Shutdown(context.Background(), cnf, true) + if err != nil { + return mysql.Position{}, err + } + + logger.Infof("Restore: deleting existing files") + if err := removeExistingFiles(cnf); err != nil { + return mysql.Position{}, err + } + + logger.Infof("Restore: reinit config file") + err = mysqld.ReinitConfig(context.Background(), cnf) + if err != nil { + return mysql.Position{}, err + } + + logger.Infof("Restore: copying all files") + if err := be.restoreFiles(context.Background(), cnf, bh, bm.FileEntries, bm.TransformHook, !bm.SkipCompress, restoreConcurrency, hookExtraEnv); err != nil { + return mysql.Position{}, err + } + + return bm.Position, nil +} + +// restoreFiles will copy all the files from the BackupStorage to the +// right place. +func (be *BuiltinBackupEngine) restoreFiles(ctx context.Context, cnf *Mycnf, bh backupstorage.BackupHandle, fes []FileEntry, transformHook string, compress bool, restoreConcurrency int, hookExtraEnv map[string]string) error { + sema := sync2.NewSemaphore(restoreConcurrency, 0) + rec := concurrency.AllErrorRecorder{} + wg := sync.WaitGroup{} + for i := range fes { + wg.Add(1) + go func(i int) { + defer wg.Done() + + // Wait until we are ready to go, skip if we already + // encountered an error. + sema.Acquire() + defer sema.Release() + if rec.HasErrors() { + return + } + + // And restore the file. + name := fmt.Sprintf("%v", i) + rec.RecordError(be.restoreFile(ctx, cnf, bh, &fes[i], transformHook, compress, name, hookExtraEnv)) + }(i) + } + wg.Wait() + return rec.Error() +} + +// restoreFile restores an individual file. +func (be *BuiltinBackupEngine) restoreFile(ctx context.Context, cnf *Mycnf, bh backupstorage.BackupHandle, fe *FileEntry, transformHook string, compress bool, name string, hookExtraEnv map[string]string) (err error) { + // Open the source file for reading. + var source io.ReadCloser + source, err = bh.ReadFile(ctx, name) + if err != nil { + return err + } + defer source.Close() + + // Open the destination file for writing. + dstFile, err := fe.open(cnf, false) + if err != nil { + return err + } + defer func() { + if cerr := dstFile.Close(); cerr != nil { + if err != nil { + // We already have an error, just log this one. + log.Errorf("failed to close file %v: %v", name, cerr) + } else { + err = cerr + } + } + }() + + // Create a buffering output. + dst := bufio.NewWriterSize(dstFile, 2*1024*1024) + + // Create hash to write the compressed data to. + hasher := newHasher() + + // Create a Tee: we split the input into the hasher + // and into the gunziper. + reader := io.TeeReader(source, hasher) + + // Create the external read pipe, if any. + var wait hook.WaitFunc + if transformHook != "" { + h := hook.NewHook(transformHook, []string{"-operation", "read"}) + h.ExtraEnv = hookExtraEnv + reader, wait, _, err = h.ExecuteAsReadPipe(reader) + if err != nil { + return fmt.Errorf("'%v' hook returned error: %v", transformHook, err) + } + } + + // Create the uncompresser if needed. + if compress { + gz, err := pgzip.NewReader(reader) + if err != nil { + return err + } + defer func() { + if cerr := gz.Close(); cerr != nil { + if err != nil { + // We already have an error, just log this one. + log.Errorf("failed to close gunziper %v: %v", name, cerr) + } else { + err = cerr + } + } + }() + reader = gz + } + + // Copy the data. Will also write to the hasher. + if _, err = io.Copy(dst, reader); err != nil { + return err + } + + // Close the Pipe. + if wait != nil { + stderr, err := wait() + if stderr != "" { + log.Infof("'%v' hook returned stderr: %v", transformHook, stderr) + } + if err != nil { + return fmt.Errorf("'%v' returned error: %v", transformHook, err) + } + } + + // Check the hash. + hash := hasher.HashString() + if hash != fe.Hash { + return fmt.Errorf("hash mismatch for %v, got %v expected %v", fe.Name, hash, fe.Hash) + } + + // Flush the buffer. + return dst.Flush() +} + +func init() { + BackupEngineMap["builtin"] = &BuiltinBackupEngine{} +} diff --git a/go/vt/mysqlctl/xtrabackupengine.go b/go/vt/mysqlctl/xtrabackupengine.go new file mode 100644 index 00000000000..ea6ef20a26a --- /dev/null +++ b/go/vt/mysqlctl/xtrabackupengine.go @@ -0,0 +1,402 @@ +/* +Copyright 2019 The Vitess Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package mysqlctl + +import ( + "bufio" + "context" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path" + "strings" + + "github.com/klauspost/pgzip" + "vitess.io/vitess/go/mysql" + "vitess.io/vitess/go/vt/logutil" + "vitess.io/vitess/go/vt/mysqlctl/backupstorage" + "vitess.io/vitess/go/vt/vterrors" +) + +// XtrabackupEngine encapsulates the logic of the xtrabackup engine +// it implements the BackupEngine interface and contains all the logic +// required to implement a backup/restore by invoking xtrabackup with +// the appropriate parameters +type XtrabackupEngine struct { +} + +var ( + // path where backup engine program is located + // TODO assume lives on path and remove this option? + xtrabackupEnginePath = flag.String("xtrabackup_root_path", "", "directory location of the xtrabackup executable, e.g., /usr/bin") + // TBD whether to support flags to pass through to backup engine + xtrabackupBackupFlags = flag.String("xtrabackup_backup_flags", "", "flags to pass to backup command. these will be added to the end of the command") + // TBD whether to support flags to pass through to restore phase + xtrabackupRestoreFlags = flag.String("xtrabackup_restore_flags", "", "flags to pass to restore command. these will be added to the end of the command") + // streaming mode + xtrabackupStreamMode = flag.String("xtrabackup_stream_mode", "tar", "which mode to use if streaming, valid values are tar and xbstream") +) + +const ( + streamModeTar = "tar" + xtrabackup = "xtrabackup" + xbstream = "xbstream" + binlogInfoFileName = "xtrabackup_binlog_info" + successMsg = "completed OK!" +) + +func (be *XtrabackupEngine) backupFileName() string { + fileName := "backup" + if *xtrabackupStreamMode != "" { + fileName += "." + fileName += *xtrabackupStreamMode + } + if *backupStorageCompress { + fileName += ".gz" + } + return fileName +} + +// ExecuteBackup returns a boolean that indicates if the backup is usable, +// and an overall error. +func (be *XtrabackupEngine) ExecuteBackup(ctx context.Context, cnf *Mycnf, mysqld MysqlDaemon, logger logutil.Logger, bh backupstorage.BackupHandle, backupConcurrency int, hookExtraEnv map[string]string) (bool, error) { + + /* TODO uncomment if we keep this option + if *xtrabackupEnginePath == "" { + return false, errors.New("xtrabackup_root_path must be provided") + } + */ + backupProgram := path.Join(*xtrabackupEnginePath, xtrabackup) + // TODO check that the executable file exists, exit if it doesn't or isn't executable + + // add --slave-info assuming this is a replica tablet + // TODO what if it is master? + + // TODO need to pass backup username here + flagsToExec := []string{"--defaults-file=" + cnf.path, + "--backup", + "--socket=" + cnf.SocketFile, + "--slave-info", + //"--user=vt_dba", + } + if *xtrabackupStreamMode != "" { + flagsToExec = append(flagsToExec, "--stream="+*xtrabackupStreamMode) + } + + if *xtrabackupBackupFlags != "" { + flagsToExec = append(flagsToExec, strings.Fields(*xtrabackupBackupFlags)...) + } + + backupFileName := be.backupFileName() + + wc, err := bh.AddFile(ctx, backupFileName, 0) + if err != nil { + return false, fmt.Errorf("cannot create backup file %v: %v", backupFileName, err) + } + defer func() { + if closeErr := wc.Close(); err == nil { + err = closeErr + } + }() + + backupCmd := exec.Command(backupProgram, flagsToExec...) + backupOut, _ := backupCmd.StdoutPipe() + backupErr, _ := backupCmd.StderrPipe() + dst := bufio.NewWriterSize(wc, 2*1024*1024) + writer := io.MultiWriter(dst) + + // Create the gzip compression pipe, if necessary. + var gzip *pgzip.Writer + if *backupStorageCompress { + gzip, err = pgzip.NewWriterLevel(writer, pgzip.BestSpeed) + if err != nil { + return false, fmt.Errorf("cannot create gziper: %v", err) + } + gzip.SetConcurrency(*backupCompressBlockSize, *backupCompressBlocks) + writer = gzip + } + + backupCmd.Start() + + // Copy from the stream output to destination file (optional gzip) + _, err = io.Copy(writer, backupOut) + if err != nil { + return false, fmt.Errorf("cannot copy data: %v", err) + } + + // Close gzip to flush it, after that all data is sent to writer. + if gzip != nil { + if err = gzip.Close(); err != nil { + return false, fmt.Errorf("cannot close gzip: %v", err) + } + } + + // Flush the buffer to finish writing on destination. + if err = dst.Flush(); err != nil { + return false, fmt.Errorf("cannot flush dst: %v", err) + } + + errOutput, err := ioutil.ReadAll(backupErr) + backupCmd.Wait() + output := string(errOutput) + + logger.Infof("Xtrabackup backup command output: %v", output) + // check for success message : xtrabackup: completed OK! + usable := (err == nil && strings.Contains(output, successMsg)) + + return usable, nil +} + +// ExecuteRestore restores from a backup. Any error is returned. +func (be *XtrabackupEngine) ExecuteRestore( + ctx context.Context, + cnf *Mycnf, + mysqld MysqlDaemon, + logger logutil.Logger, + dir string, + bhs []backupstorage.BackupHandle, + restoreConcurrency int, + hookExtraEnv map[string]string) (mysql.Position, error) { + + /* TODO uncomment if we keep this option + if *xtrabackupEnginePath == "" { + return mysql.Position{}, errors.New("xtrabackup_root_path must be provided") + } */ + + // Starting from here we won't be able to recover if we get stopped by a cancelled + // context. Thus we use the background context to get through to the finish. + + logger.Infof("Restore: shutdown mysqld") + err := mysqld.Shutdown(context.Background(), cnf, true) + if err != nil { + return mysql.Position{}, err + } + + logger.Infof("Restore: deleting existing files") + if err := removeExistingFiles(cnf); err != nil { + return mysql.Position{}, err + } + + logger.Infof("Restore: reinit config file") + err = mysqld.ReinitConfig(context.Background(), cnf) + if err != nil { + return mysql.Position{}, err + } + + // copy / extract files + logger.Infof("Restore: Extracting all files") + + // first download the file into a tmp dir + // use the latest backup + + bh := bhs[len(bhs)-1] + + // extract all the files + if err := be.restoreFile(ctx, cnf, logger, bh, *backupStorageHook, *backupStorageCompress, be.backupFileName(), hookExtraEnv); err != nil { + logger.Errorf("error restoring backup file %v:%v", be.backupFileName(), err) + return mysql.Position{}, err + } + + // copy / extract files + logger.Infof("Restore: Preparing the files") + // prepare the backup + program := path.Join(*xtrabackupEnginePath, xtrabackup) + flagsToExec := []string{"--defaults-file=" + cnf.path, + "--prepare", + "--target-dir=" + cnf.TmpDir, + } + prepareCmd := exec.Command(program, flagsToExec...) + prepareOut, _ := prepareCmd.StdoutPipe() + prepareErr, _ := prepareCmd.StderrPipe() + prepareCmd.Start() + errOutput, _ := ioutil.ReadAll(prepareErr) + stdOutput, _ := ioutil.ReadAll(prepareOut) + err = prepareCmd.Wait() + if string(stdOutput) != "" { + // TODO remove after testing + logger.Infof("Prepare stdout %v", string(stdOutput)) + } + output := string(errOutput) + if output != "" { + // TODO remove after testing + logger.Infof("Prepare stderr %v", output) + } + + if err != nil { + return mysql.Position{}, err + } + if !strings.Contains(output, successMsg) { + return mysql.Position{}, errors.New("Prepare step failed") + } + + // then copy-back + logger.Infof("Restore: Copying the files") + + flagsToExec = []string{"--defaults-file=" + cnf.path, + "--copy-back", + "--target-dir=" + cnf.TmpDir, + } + copybackCmd := exec.Command(program, flagsToExec...) + // TODO: check stdout for OK message + copybackErr, _ := copybackCmd.StderrPipe() + copybackOut, _ := copybackCmd.StdoutPipe() + copybackCmd.Start() + errOutput, _ = ioutil.ReadAll(copybackErr) + stdOutput, _ = ioutil.ReadAll(copybackOut) + err = copybackCmd.Wait() + output = string(errOutput) + if output != "" { + // TODO remove after testing + logger.Infof("Copy-back stderr %v", string(output)) + } + if string(stdOutput) != "" { + // TODO remove after testing + logger.Infof("Copy-back stdout %v", string(stdOutput)) + } + + if err != nil { + return mysql.Position{}, err + } + if !strings.Contains(output, successMsg) { + return mysql.Position{}, errors.New("Copy-back step failed") + } + + // now find the slave position and return that + binlogInfoFile, err := os.Open(path.Join(cnf.TmpDir, binlogInfoFileName)) + if err != nil { + return mysql.Position{}, err + } + defer binlogInfoFile.Close() + scanner := bufio.NewScanner(binlogInfoFile) + scanner.Split(bufio.ScanWords) + counter := 0 + var replicationPosition mysql.Position + for counter < 3 { + scanner.Scan() + if counter == 2 { + mysqlFlavor := os.Getenv("MYSQL_FLAVOR") + if replicationPosition, err = mysql.ParsePosition(mysqlFlavor, scanner.Text()); err != nil { + return mysql.Position{}, err + } + } + counter = counter + 1 + } + // TODO clean up extracted files from TmpDir + return replicationPosition, nil +} + +// restoreFile restores an individual file. +func (be *XtrabackupEngine) restoreFile( + ctx context.Context, + cnf *Mycnf, + logger logutil.Logger, + bh backupstorage.BackupHandle, + transformHook string, + compress bool, + name string, + hookExtraEnv map[string]string) (err error) { + + streamMode := *xtrabackupStreamMode + // Open the source file for reading. + var source io.ReadCloser + source, err = bh.ReadFile(ctx, name) + if err != nil { + return err + } + defer source.Close() + + reader := io.MultiReader(source) + + // Create the uncompresser if needed. + if compress { + gz, err := pgzip.NewReader(reader) + if err != nil { + return err + } + defer func() { + if cerr := gz.Close(); cerr != nil { + if err != nil { + // We already have an error, just log this one. + logger.Errorf("failed to close gunziper %v: %v", name, cerr) + } else { + err = cerr + } + } + }() + reader = gz + } + + switch streamMode { + case streamModeTar: + // now extract the files by running tar + // error if we can't find tar + flagsToExec := []string{"-C", cnf.TmpDir, "-xi"} + tarCmd := exec.Command("tar", flagsToExec...) + logger.Infof("Executing tar cmd with flags %v", flagsToExec) + tarCmd.Stdin = reader + tarOut, _ := tarCmd.StdoutPipe() + tarErr, _ := tarCmd.StderrPipe() + tarCmd.Start() + output, _ := ioutil.ReadAll(tarOut) + errOutput, _ := ioutil.ReadAll(tarErr) + err := tarCmd.Wait() + + if string(output) != "" { + logger.Infof("output from tar: %v ", string(output)) + } + if string(errOutput) != "" { + logger.Infof("error from tar: %v ", string(errOutput)) + } + if err != nil { + return vterrors.Wrapf(err, "error from tar") + } + + case xbstream: + // now extract the files by running xbstream + xbstreamProgram := path.Join(*xtrabackupEnginePath, xbstream) + flagsToExec := []string{"-C", cnf.TmpDir, "-x"} + xbstreamCmd := exec.Command(xbstreamProgram, flagsToExec...) + logger.Infof("Executing xbstream cmd: %v %v", xbstreamProgram, flagsToExec) + xbstreamCmd.Stdin = reader + xbstreamOut, _ := xbstreamCmd.StdoutPipe() + xbstreamErr, _ := xbstreamCmd.StderrPipe() + xbstreamCmd.Start() + output, _ := ioutil.ReadAll(xbstreamOut) + errOutput, _ := ioutil.ReadAll(xbstreamErr) + err := xbstreamCmd.Wait() + + if string(output) != "" { + logger.Infof("Output from xbstream: %v ", string(output)) + } + if string(errOutput) != "" { + logger.Infof("error from xbstream: %v", string(errOutput)) + } + if err != nil { + return vterrors.Wrapf(err, "error from xbstream") + } + default: + } + return nil +} + +func init() { + BackupEngineMap[xtrabackup] = &XtrabackupEngine{} +} diff --git a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go index 432b78cad9b..d3e5ea3e92c 100644 --- a/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go +++ b/go/vt/proto/tabletmanagerdata/tabletmanagerdata.pb.go @@ -46,7 +46,7 @@ func (m *TableDefinition) Reset() { *m = TableDefinition{} } func (m *TableDefinition) String() string { return proto.CompactTextString(m) } func (*TableDefinition) ProtoMessage() {} func (*TableDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{0} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{0} } func (m *TableDefinition) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TableDefinition.Unmarshal(m, b) @@ -128,7 +128,7 @@ func (m *SchemaDefinition) Reset() { *m = SchemaDefinition{} } func (m *SchemaDefinition) String() string { return proto.CompactTextString(m) } func (*SchemaDefinition) ProtoMessage() {} func (*SchemaDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{1} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{1} } func (m *SchemaDefinition) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SchemaDefinition.Unmarshal(m, b) @@ -183,7 +183,7 @@ func (m *SchemaChangeResult) Reset() { *m = SchemaChangeResult{} } func (m *SchemaChangeResult) String() string { return proto.CompactTextString(m) } func (*SchemaChangeResult) ProtoMessage() {} func (*SchemaChangeResult) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{2} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{2} } func (m *SchemaChangeResult) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SchemaChangeResult.Unmarshal(m, b) @@ -234,7 +234,7 @@ func (m *UserPermission) Reset() { *m = UserPermission{} } func (m *UserPermission) String() string { return proto.CompactTextString(m) } func (*UserPermission) ProtoMessage() {} func (*UserPermission) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{3} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{3} } func (m *UserPermission) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UserPermission.Unmarshal(m, b) @@ -298,7 +298,7 @@ func (m *DbPermission) Reset() { *m = DbPermission{} } func (m *DbPermission) String() string { return proto.CompactTextString(m) } func (*DbPermission) ProtoMessage() {} func (*DbPermission) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{4} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{4} } func (m *DbPermission) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DbPermission.Unmarshal(m, b) @@ -360,7 +360,7 @@ func (m *Permissions) Reset() { *m = Permissions{} } func (m *Permissions) String() string { return proto.CompactTextString(m) } func (*Permissions) ProtoMessage() {} func (*Permissions) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{5} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{5} } func (m *Permissions) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Permissions.Unmarshal(m, b) @@ -405,7 +405,7 @@ func (m *PingRequest) Reset() { *m = PingRequest{} } func (m *PingRequest) String() string { return proto.CompactTextString(m) } func (*PingRequest) ProtoMessage() {} func (*PingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{6} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{6} } func (m *PingRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PingRequest.Unmarshal(m, b) @@ -443,7 +443,7 @@ func (m *PingResponse) Reset() { *m = PingResponse{} } func (m *PingResponse) String() string { return proto.CompactTextString(m) } func (*PingResponse) ProtoMessage() {} func (*PingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{7} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{7} } func (m *PingResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PingResponse.Unmarshal(m, b) @@ -482,7 +482,7 @@ func (m *SleepRequest) Reset() { *m = SleepRequest{} } func (m *SleepRequest) String() string { return proto.CompactTextString(m) } func (*SleepRequest) ProtoMessage() {} func (*SleepRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{8} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{8} } func (m *SleepRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SleepRequest.Unmarshal(m, b) @@ -519,7 +519,7 @@ func (m *SleepResponse) Reset() { *m = SleepResponse{} } func (m *SleepResponse) String() string { return proto.CompactTextString(m) } func (*SleepResponse) ProtoMessage() {} func (*SleepResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{9} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{9} } func (m *SleepResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SleepResponse.Unmarshal(m, b) @@ -552,7 +552,7 @@ func (m *ExecuteHookRequest) Reset() { *m = ExecuteHookRequest{} } func (m *ExecuteHookRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteHookRequest) ProtoMessage() {} func (*ExecuteHookRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{10} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{10} } func (m *ExecuteHookRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteHookRequest.Unmarshal(m, b) @@ -606,7 +606,7 @@ func (m *ExecuteHookResponse) Reset() { *m = ExecuteHookResponse{} } func (m *ExecuteHookResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteHookResponse) ProtoMessage() {} func (*ExecuteHookResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{11} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{11} } func (m *ExecuteHookResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteHookResponse.Unmarshal(m, b) @@ -660,7 +660,7 @@ func (m *GetSchemaRequest) Reset() { *m = GetSchemaRequest{} } func (m *GetSchemaRequest) String() string { return proto.CompactTextString(m) } func (*GetSchemaRequest) ProtoMessage() {} func (*GetSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{12} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{12} } func (m *GetSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSchemaRequest.Unmarshal(m, b) @@ -712,7 +712,7 @@ func (m *GetSchemaResponse) Reset() { *m = GetSchemaResponse{} } func (m *GetSchemaResponse) String() string { return proto.CompactTextString(m) } func (*GetSchemaResponse) ProtoMessage() {} func (*GetSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{13} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{13} } func (m *GetSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSchemaResponse.Unmarshal(m, b) @@ -749,7 +749,7 @@ func (m *GetPermissionsRequest) Reset() { *m = GetPermissionsRequest{} } func (m *GetPermissionsRequest) String() string { return proto.CompactTextString(m) } func (*GetPermissionsRequest) ProtoMessage() {} func (*GetPermissionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{14} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{14} } func (m *GetPermissionsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetPermissionsRequest.Unmarshal(m, b) @@ -780,7 +780,7 @@ func (m *GetPermissionsResponse) Reset() { *m = GetPermissionsResponse{} func (m *GetPermissionsResponse) String() string { return proto.CompactTextString(m) } func (*GetPermissionsResponse) ProtoMessage() {} func (*GetPermissionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{15} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{15} } func (m *GetPermissionsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetPermissionsResponse.Unmarshal(m, b) @@ -817,7 +817,7 @@ func (m *SetReadOnlyRequest) Reset() { *m = SetReadOnlyRequest{} } func (m *SetReadOnlyRequest) String() string { return proto.CompactTextString(m) } func (*SetReadOnlyRequest) ProtoMessage() {} func (*SetReadOnlyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{16} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{16} } func (m *SetReadOnlyRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetReadOnlyRequest.Unmarshal(m, b) @@ -847,7 +847,7 @@ func (m *SetReadOnlyResponse) Reset() { *m = SetReadOnlyResponse{} } func (m *SetReadOnlyResponse) String() string { return proto.CompactTextString(m) } func (*SetReadOnlyResponse) ProtoMessage() {} func (*SetReadOnlyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{17} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{17} } func (m *SetReadOnlyResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetReadOnlyResponse.Unmarshal(m, b) @@ -877,7 +877,7 @@ func (m *SetReadWriteRequest) Reset() { *m = SetReadWriteRequest{} } func (m *SetReadWriteRequest) String() string { return proto.CompactTextString(m) } func (*SetReadWriteRequest) ProtoMessage() {} func (*SetReadWriteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{18} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{18} } func (m *SetReadWriteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetReadWriteRequest.Unmarshal(m, b) @@ -907,7 +907,7 @@ func (m *SetReadWriteResponse) Reset() { *m = SetReadWriteResponse{} } func (m *SetReadWriteResponse) String() string { return proto.CompactTextString(m) } func (*SetReadWriteResponse) ProtoMessage() {} func (*SetReadWriteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{19} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{19} } func (m *SetReadWriteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetReadWriteResponse.Unmarshal(m, b) @@ -938,7 +938,7 @@ func (m *ChangeTypeRequest) Reset() { *m = ChangeTypeRequest{} } func (m *ChangeTypeRequest) String() string { return proto.CompactTextString(m) } func (*ChangeTypeRequest) ProtoMessage() {} func (*ChangeTypeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{20} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{20} } func (m *ChangeTypeRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChangeTypeRequest.Unmarshal(m, b) @@ -975,7 +975,7 @@ func (m *ChangeTypeResponse) Reset() { *m = ChangeTypeResponse{} } func (m *ChangeTypeResponse) String() string { return proto.CompactTextString(m) } func (*ChangeTypeResponse) ProtoMessage() {} func (*ChangeTypeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{21} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{21} } func (m *ChangeTypeResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ChangeTypeResponse.Unmarshal(m, b) @@ -1005,7 +1005,7 @@ func (m *RefreshStateRequest) Reset() { *m = RefreshStateRequest{} } func (m *RefreshStateRequest) String() string { return proto.CompactTextString(m) } func (*RefreshStateRequest) ProtoMessage() {} func (*RefreshStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{22} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{22} } func (m *RefreshStateRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RefreshStateRequest.Unmarshal(m, b) @@ -1035,7 +1035,7 @@ func (m *RefreshStateResponse) Reset() { *m = RefreshStateResponse{} } func (m *RefreshStateResponse) String() string { return proto.CompactTextString(m) } func (*RefreshStateResponse) ProtoMessage() {} func (*RefreshStateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{23} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{23} } func (m *RefreshStateResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RefreshStateResponse.Unmarshal(m, b) @@ -1065,7 +1065,7 @@ func (m *RunHealthCheckRequest) Reset() { *m = RunHealthCheckRequest{} } func (m *RunHealthCheckRequest) String() string { return proto.CompactTextString(m) } func (*RunHealthCheckRequest) ProtoMessage() {} func (*RunHealthCheckRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{24} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{24} } func (m *RunHealthCheckRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RunHealthCheckRequest.Unmarshal(m, b) @@ -1095,7 +1095,7 @@ func (m *RunHealthCheckResponse) Reset() { *m = RunHealthCheckResponse{} func (m *RunHealthCheckResponse) String() string { return proto.CompactTextString(m) } func (*RunHealthCheckResponse) ProtoMessage() {} func (*RunHealthCheckResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{25} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{25} } func (m *RunHealthCheckResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RunHealthCheckResponse.Unmarshal(m, b) @@ -1126,7 +1126,7 @@ func (m *IgnoreHealthErrorRequest) Reset() { *m = IgnoreHealthErrorReque func (m *IgnoreHealthErrorRequest) String() string { return proto.CompactTextString(m) } func (*IgnoreHealthErrorRequest) ProtoMessage() {} func (*IgnoreHealthErrorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{26} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{26} } func (m *IgnoreHealthErrorRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_IgnoreHealthErrorRequest.Unmarshal(m, b) @@ -1163,7 +1163,7 @@ func (m *IgnoreHealthErrorResponse) Reset() { *m = IgnoreHealthErrorResp func (m *IgnoreHealthErrorResponse) String() string { return proto.CompactTextString(m) } func (*IgnoreHealthErrorResponse) ProtoMessage() {} func (*IgnoreHealthErrorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{27} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{27} } func (m *IgnoreHealthErrorResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_IgnoreHealthErrorResponse.Unmarshal(m, b) @@ -1197,7 +1197,7 @@ func (m *ReloadSchemaRequest) Reset() { *m = ReloadSchemaRequest{} } func (m *ReloadSchemaRequest) String() string { return proto.CompactTextString(m) } func (*ReloadSchemaRequest) ProtoMessage() {} func (*ReloadSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{28} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{28} } func (m *ReloadSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReloadSchemaRequest.Unmarshal(m, b) @@ -1234,7 +1234,7 @@ func (m *ReloadSchemaResponse) Reset() { *m = ReloadSchemaResponse{} } func (m *ReloadSchemaResponse) String() string { return proto.CompactTextString(m) } func (*ReloadSchemaResponse) ProtoMessage() {} func (*ReloadSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{29} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{29} } func (m *ReloadSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ReloadSchemaResponse.Unmarshal(m, b) @@ -1265,7 +1265,7 @@ func (m *PreflightSchemaRequest) Reset() { *m = PreflightSchemaRequest{} func (m *PreflightSchemaRequest) String() string { return proto.CompactTextString(m) } func (*PreflightSchemaRequest) ProtoMessage() {} func (*PreflightSchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{30} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{30} } func (m *PreflightSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PreflightSchemaRequest.Unmarshal(m, b) @@ -1305,7 +1305,7 @@ func (m *PreflightSchemaResponse) Reset() { *m = PreflightSchemaResponse func (m *PreflightSchemaResponse) String() string { return proto.CompactTextString(m) } func (*PreflightSchemaResponse) ProtoMessage() {} func (*PreflightSchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{31} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{31} } func (m *PreflightSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PreflightSchemaResponse.Unmarshal(m, b) @@ -1347,7 +1347,7 @@ func (m *ApplySchemaRequest) Reset() { *m = ApplySchemaRequest{} } func (m *ApplySchemaRequest) String() string { return proto.CompactTextString(m) } func (*ApplySchemaRequest) ProtoMessage() {} func (*ApplySchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{32} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{32} } func (m *ApplySchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ApplySchemaRequest.Unmarshal(m, b) @@ -1414,7 +1414,7 @@ func (m *ApplySchemaResponse) Reset() { *m = ApplySchemaResponse{} } func (m *ApplySchemaResponse) String() string { return proto.CompactTextString(m) } func (*ApplySchemaResponse) ProtoMessage() {} func (*ApplySchemaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{33} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{33} } func (m *ApplySchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ApplySchemaResponse.Unmarshal(m, b) @@ -1458,7 +1458,7 @@ func (m *LockTablesRequest) Reset() { *m = LockTablesRequest{} } func (m *LockTablesRequest) String() string { return proto.CompactTextString(m) } func (*LockTablesRequest) ProtoMessage() {} func (*LockTablesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{34} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{34} } func (m *LockTablesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LockTablesRequest.Unmarshal(m, b) @@ -1488,7 +1488,7 @@ func (m *LockTablesResponse) Reset() { *m = LockTablesResponse{} } func (m *LockTablesResponse) String() string { return proto.CompactTextString(m) } func (*LockTablesResponse) ProtoMessage() {} func (*LockTablesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{35} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{35} } func (m *LockTablesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LockTablesResponse.Unmarshal(m, b) @@ -1518,7 +1518,7 @@ func (m *UnlockTablesRequest) Reset() { *m = UnlockTablesRequest{} } func (m *UnlockTablesRequest) String() string { return proto.CompactTextString(m) } func (*UnlockTablesRequest) ProtoMessage() {} func (*UnlockTablesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{36} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{36} } func (m *UnlockTablesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UnlockTablesRequest.Unmarshal(m, b) @@ -1548,7 +1548,7 @@ func (m *UnlockTablesResponse) Reset() { *m = UnlockTablesResponse{} } func (m *UnlockTablesResponse) String() string { return proto.CompactTextString(m) } func (*UnlockTablesResponse) ProtoMessage() {} func (*UnlockTablesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{37} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{37} } func (m *UnlockTablesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UnlockTablesResponse.Unmarshal(m, b) @@ -1583,7 +1583,7 @@ func (m *ExecuteFetchAsDbaRequest) Reset() { *m = ExecuteFetchAsDbaReque func (m *ExecuteFetchAsDbaRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteFetchAsDbaRequest) ProtoMessage() {} func (*ExecuteFetchAsDbaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{38} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{38} } func (m *ExecuteFetchAsDbaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteFetchAsDbaRequest.Unmarshal(m, b) @@ -1649,7 +1649,7 @@ func (m *ExecuteFetchAsDbaResponse) Reset() { *m = ExecuteFetchAsDbaResp func (m *ExecuteFetchAsDbaResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteFetchAsDbaResponse) ProtoMessage() {} func (*ExecuteFetchAsDbaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{39} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{39} } func (m *ExecuteFetchAsDbaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteFetchAsDbaResponse.Unmarshal(m, b) @@ -1690,7 +1690,7 @@ func (m *ExecuteFetchAsAllPrivsRequest) Reset() { *m = ExecuteFetchAsAll func (m *ExecuteFetchAsAllPrivsRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteFetchAsAllPrivsRequest) ProtoMessage() {} func (*ExecuteFetchAsAllPrivsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{40} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{40} } func (m *ExecuteFetchAsAllPrivsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteFetchAsAllPrivsRequest.Unmarshal(m, b) @@ -1749,7 +1749,7 @@ func (m *ExecuteFetchAsAllPrivsResponse) Reset() { *m = ExecuteFetchAsAl func (m *ExecuteFetchAsAllPrivsResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteFetchAsAllPrivsResponse) ProtoMessage() {} func (*ExecuteFetchAsAllPrivsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{41} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{41} } func (m *ExecuteFetchAsAllPrivsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteFetchAsAllPrivsResponse.Unmarshal(m, b) @@ -1788,7 +1788,7 @@ func (m *ExecuteFetchAsAppRequest) Reset() { *m = ExecuteFetchAsAppReque func (m *ExecuteFetchAsAppRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteFetchAsAppRequest) ProtoMessage() {} func (*ExecuteFetchAsAppRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{42} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{42} } func (m *ExecuteFetchAsAppRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteFetchAsAppRequest.Unmarshal(m, b) @@ -1833,7 +1833,7 @@ func (m *ExecuteFetchAsAppResponse) Reset() { *m = ExecuteFetchAsAppResp func (m *ExecuteFetchAsAppResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteFetchAsAppResponse) ProtoMessage() {} func (*ExecuteFetchAsAppResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{43} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{43} } func (m *ExecuteFetchAsAppResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteFetchAsAppResponse.Unmarshal(m, b) @@ -1870,7 +1870,7 @@ func (m *SlaveStatusRequest) Reset() { *m = SlaveStatusRequest{} } func (m *SlaveStatusRequest) String() string { return proto.CompactTextString(m) } func (*SlaveStatusRequest) ProtoMessage() {} func (*SlaveStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{44} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{44} } func (m *SlaveStatusRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SlaveStatusRequest.Unmarshal(m, b) @@ -1901,7 +1901,7 @@ func (m *SlaveStatusResponse) Reset() { *m = SlaveStatusResponse{} } func (m *SlaveStatusResponse) String() string { return proto.CompactTextString(m) } func (*SlaveStatusResponse) ProtoMessage() {} func (*SlaveStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{45} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{45} } func (m *SlaveStatusResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SlaveStatusResponse.Unmarshal(m, b) @@ -1938,7 +1938,7 @@ func (m *MasterPositionRequest) Reset() { *m = MasterPositionRequest{} } func (m *MasterPositionRequest) String() string { return proto.CompactTextString(m) } func (*MasterPositionRequest) ProtoMessage() {} func (*MasterPositionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{46} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{46} } func (m *MasterPositionRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MasterPositionRequest.Unmarshal(m, b) @@ -1969,7 +1969,7 @@ func (m *MasterPositionResponse) Reset() { *m = MasterPositionResponse{} func (m *MasterPositionResponse) String() string { return proto.CompactTextString(m) } func (*MasterPositionResponse) ProtoMessage() {} func (*MasterPositionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{47} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{47} } func (m *MasterPositionResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MasterPositionResponse.Unmarshal(m, b) @@ -2006,7 +2006,7 @@ func (m *StopSlaveRequest) Reset() { *m = StopSlaveRequest{} } func (m *StopSlaveRequest) String() string { return proto.CompactTextString(m) } func (*StopSlaveRequest) ProtoMessage() {} func (*StopSlaveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{48} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{48} } func (m *StopSlaveRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopSlaveRequest.Unmarshal(m, b) @@ -2036,7 +2036,7 @@ func (m *StopSlaveResponse) Reset() { *m = StopSlaveResponse{} } func (m *StopSlaveResponse) String() string { return proto.CompactTextString(m) } func (*StopSlaveResponse) ProtoMessage() {} func (*StopSlaveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{49} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{49} } func (m *StopSlaveResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopSlaveResponse.Unmarshal(m, b) @@ -2068,7 +2068,7 @@ func (m *StopSlaveMinimumRequest) Reset() { *m = StopSlaveMinimumRequest func (m *StopSlaveMinimumRequest) String() string { return proto.CompactTextString(m) } func (*StopSlaveMinimumRequest) ProtoMessage() {} func (*StopSlaveMinimumRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{50} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{50} } func (m *StopSlaveMinimumRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopSlaveMinimumRequest.Unmarshal(m, b) @@ -2113,7 +2113,7 @@ func (m *StopSlaveMinimumResponse) Reset() { *m = StopSlaveMinimumRespon func (m *StopSlaveMinimumResponse) String() string { return proto.CompactTextString(m) } func (*StopSlaveMinimumResponse) ProtoMessage() {} func (*StopSlaveMinimumResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{51} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{51} } func (m *StopSlaveMinimumResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopSlaveMinimumResponse.Unmarshal(m, b) @@ -2150,7 +2150,7 @@ func (m *StartSlaveRequest) Reset() { *m = StartSlaveRequest{} } func (m *StartSlaveRequest) String() string { return proto.CompactTextString(m) } func (*StartSlaveRequest) ProtoMessage() {} func (*StartSlaveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{52} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{52} } func (m *StartSlaveRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartSlaveRequest.Unmarshal(m, b) @@ -2180,7 +2180,7 @@ func (m *StartSlaveResponse) Reset() { *m = StartSlaveResponse{} } func (m *StartSlaveResponse) String() string { return proto.CompactTextString(m) } func (*StartSlaveResponse) ProtoMessage() {} func (*StartSlaveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{53} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{53} } func (m *StartSlaveResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartSlaveResponse.Unmarshal(m, b) @@ -2212,7 +2212,7 @@ func (m *StartSlaveUntilAfterRequest) Reset() { *m = StartSlaveUntilAfte func (m *StartSlaveUntilAfterRequest) String() string { return proto.CompactTextString(m) } func (*StartSlaveUntilAfterRequest) ProtoMessage() {} func (*StartSlaveUntilAfterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{54} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{54} } func (m *StartSlaveUntilAfterRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartSlaveUntilAfterRequest.Unmarshal(m, b) @@ -2256,7 +2256,7 @@ func (m *StartSlaveUntilAfterResponse) Reset() { *m = StartSlaveUntilAft func (m *StartSlaveUntilAfterResponse) String() string { return proto.CompactTextString(m) } func (*StartSlaveUntilAfterResponse) ProtoMessage() {} func (*StartSlaveUntilAfterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{55} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{55} } func (m *StartSlaveUntilAfterResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartSlaveUntilAfterResponse.Unmarshal(m, b) @@ -2290,7 +2290,7 @@ func (m *TabletExternallyReparentedRequest) Reset() { *m = TabletExterna func (m *TabletExternallyReparentedRequest) String() string { return proto.CompactTextString(m) } func (*TabletExternallyReparentedRequest) ProtoMessage() {} func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{56} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{56} } func (m *TabletExternallyReparentedRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TabletExternallyReparentedRequest.Unmarshal(m, b) @@ -2327,7 +2327,7 @@ func (m *TabletExternallyReparentedResponse) Reset() { *m = TabletExtern func (m *TabletExternallyReparentedResponse) String() string { return proto.CompactTextString(m) } func (*TabletExternallyReparentedResponse) ProtoMessage() {} func (*TabletExternallyReparentedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{57} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{57} } func (m *TabletExternallyReparentedResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TabletExternallyReparentedResponse.Unmarshal(m, b) @@ -2357,7 +2357,7 @@ func (m *TabletExternallyElectedRequest) Reset() { *m = TabletExternally func (m *TabletExternallyElectedRequest) String() string { return proto.CompactTextString(m) } func (*TabletExternallyElectedRequest) ProtoMessage() {} func (*TabletExternallyElectedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{58} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{58} } func (m *TabletExternallyElectedRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TabletExternallyElectedRequest.Unmarshal(m, b) @@ -2387,7 +2387,7 @@ func (m *TabletExternallyElectedResponse) Reset() { *m = TabletExternall func (m *TabletExternallyElectedResponse) String() string { return proto.CompactTextString(m) } func (*TabletExternallyElectedResponse) ProtoMessage() {} func (*TabletExternallyElectedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{59} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{59} } func (m *TabletExternallyElectedResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TabletExternallyElectedResponse.Unmarshal(m, b) @@ -2417,7 +2417,7 @@ func (m *GetSlavesRequest) Reset() { *m = GetSlavesRequest{} } func (m *GetSlavesRequest) String() string { return proto.CompactTextString(m) } func (*GetSlavesRequest) ProtoMessage() {} func (*GetSlavesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{60} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{60} } func (m *GetSlavesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSlavesRequest.Unmarshal(m, b) @@ -2448,7 +2448,7 @@ func (m *GetSlavesResponse) Reset() { *m = GetSlavesResponse{} } func (m *GetSlavesResponse) String() string { return proto.CompactTextString(m) } func (*GetSlavesResponse) ProtoMessage() {} func (*GetSlavesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{61} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{61} } func (m *GetSlavesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSlavesResponse.Unmarshal(m, b) @@ -2485,7 +2485,7 @@ func (m *ResetReplicationRequest) Reset() { *m = ResetReplicationRequest func (m *ResetReplicationRequest) String() string { return proto.CompactTextString(m) } func (*ResetReplicationRequest) ProtoMessage() {} func (*ResetReplicationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{62} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{62} } func (m *ResetReplicationRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResetReplicationRequest.Unmarshal(m, b) @@ -2515,7 +2515,7 @@ func (m *ResetReplicationResponse) Reset() { *m = ResetReplicationRespon func (m *ResetReplicationResponse) String() string { return proto.CompactTextString(m) } func (*ResetReplicationResponse) ProtoMessage() {} func (*ResetReplicationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{63} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{63} } func (m *ResetReplicationResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResetReplicationResponse.Unmarshal(m, b) @@ -2546,7 +2546,7 @@ func (m *VReplicationExecRequest) Reset() { *m = VReplicationExecRequest func (m *VReplicationExecRequest) String() string { return proto.CompactTextString(m) } func (*VReplicationExecRequest) ProtoMessage() {} func (*VReplicationExecRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{64} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{64} } func (m *VReplicationExecRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VReplicationExecRequest.Unmarshal(m, b) @@ -2584,7 +2584,7 @@ func (m *VReplicationExecResponse) Reset() { *m = VReplicationExecRespon func (m *VReplicationExecResponse) String() string { return proto.CompactTextString(m) } func (*VReplicationExecResponse) ProtoMessage() {} func (*VReplicationExecResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{65} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{65} } func (m *VReplicationExecResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VReplicationExecResponse.Unmarshal(m, b) @@ -2623,7 +2623,7 @@ func (m *VReplicationWaitForPosRequest) Reset() { *m = VReplicationWaitF func (m *VReplicationWaitForPosRequest) String() string { return proto.CompactTextString(m) } func (*VReplicationWaitForPosRequest) ProtoMessage() {} func (*VReplicationWaitForPosRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{66} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{66} } func (m *VReplicationWaitForPosRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VReplicationWaitForPosRequest.Unmarshal(m, b) @@ -2667,7 +2667,7 @@ func (m *VReplicationWaitForPosResponse) Reset() { *m = VReplicationWait func (m *VReplicationWaitForPosResponse) String() string { return proto.CompactTextString(m) } func (*VReplicationWaitForPosResponse) ProtoMessage() {} func (*VReplicationWaitForPosResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{67} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{67} } func (m *VReplicationWaitForPosResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VReplicationWaitForPosResponse.Unmarshal(m, b) @@ -2697,7 +2697,7 @@ func (m *InitMasterRequest) Reset() { *m = InitMasterRequest{} } func (m *InitMasterRequest) String() string { return proto.CompactTextString(m) } func (*InitMasterRequest) ProtoMessage() {} func (*InitMasterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{68} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{68} } func (m *InitMasterRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InitMasterRequest.Unmarshal(m, b) @@ -2728,7 +2728,7 @@ func (m *InitMasterResponse) Reset() { *m = InitMasterResponse{} } func (m *InitMasterResponse) String() string { return proto.CompactTextString(m) } func (*InitMasterResponse) ProtoMessage() {} func (*InitMasterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{69} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{69} } func (m *InitMasterResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InitMasterResponse.Unmarshal(m, b) @@ -2769,7 +2769,7 @@ func (m *PopulateReparentJournalRequest) Reset() { *m = PopulateReparent func (m *PopulateReparentJournalRequest) String() string { return proto.CompactTextString(m) } func (*PopulateReparentJournalRequest) ProtoMessage() {} func (*PopulateReparentJournalRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{70} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{70} } func (m *PopulateReparentJournalRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PopulateReparentJournalRequest.Unmarshal(m, b) @@ -2827,7 +2827,7 @@ func (m *PopulateReparentJournalResponse) Reset() { *m = PopulateReparen func (m *PopulateReparentJournalResponse) String() string { return proto.CompactTextString(m) } func (*PopulateReparentJournalResponse) ProtoMessage() {} func (*PopulateReparentJournalResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{71} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{71} } func (m *PopulateReparentJournalResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PopulateReparentJournalResponse.Unmarshal(m, b) @@ -2860,7 +2860,7 @@ func (m *InitSlaveRequest) Reset() { *m = InitSlaveRequest{} } func (m *InitSlaveRequest) String() string { return proto.CompactTextString(m) } func (*InitSlaveRequest) ProtoMessage() {} func (*InitSlaveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{72} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{72} } func (m *InitSlaveRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InitSlaveRequest.Unmarshal(m, b) @@ -2911,7 +2911,7 @@ func (m *InitSlaveResponse) Reset() { *m = InitSlaveResponse{} } func (m *InitSlaveResponse) String() string { return proto.CompactTextString(m) } func (*InitSlaveResponse) ProtoMessage() {} func (*InitSlaveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{73} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{73} } func (m *InitSlaveResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InitSlaveResponse.Unmarshal(m, b) @@ -2941,7 +2941,7 @@ func (m *DemoteMasterRequest) Reset() { *m = DemoteMasterRequest{} } func (m *DemoteMasterRequest) String() string { return proto.CompactTextString(m) } func (*DemoteMasterRequest) ProtoMessage() {} func (*DemoteMasterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{74} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{74} } func (m *DemoteMasterRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DemoteMasterRequest.Unmarshal(m, b) @@ -2972,7 +2972,7 @@ func (m *DemoteMasterResponse) Reset() { *m = DemoteMasterResponse{} } func (m *DemoteMasterResponse) String() string { return proto.CompactTextString(m) } func (*DemoteMasterResponse) ProtoMessage() {} func (*DemoteMasterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{75} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{75} } func (m *DemoteMasterResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DemoteMasterResponse.Unmarshal(m, b) @@ -3010,7 +3010,7 @@ func (m *PromoteSlaveWhenCaughtUpRequest) Reset() { *m = PromoteSlaveWhe func (m *PromoteSlaveWhenCaughtUpRequest) String() string { return proto.CompactTextString(m) } func (*PromoteSlaveWhenCaughtUpRequest) ProtoMessage() {} func (*PromoteSlaveWhenCaughtUpRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{76} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{76} } func (m *PromoteSlaveWhenCaughtUpRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PromoteSlaveWhenCaughtUpRequest.Unmarshal(m, b) @@ -3048,7 +3048,7 @@ func (m *PromoteSlaveWhenCaughtUpResponse) Reset() { *m = PromoteSlaveWh func (m *PromoteSlaveWhenCaughtUpResponse) String() string { return proto.CompactTextString(m) } func (*PromoteSlaveWhenCaughtUpResponse) ProtoMessage() {} func (*PromoteSlaveWhenCaughtUpResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{77} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{77} } func (m *PromoteSlaveWhenCaughtUpResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PromoteSlaveWhenCaughtUpResponse.Unmarshal(m, b) @@ -3085,7 +3085,7 @@ func (m *SlaveWasPromotedRequest) Reset() { *m = SlaveWasPromotedRequest func (m *SlaveWasPromotedRequest) String() string { return proto.CompactTextString(m) } func (*SlaveWasPromotedRequest) ProtoMessage() {} func (*SlaveWasPromotedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{78} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{78} } func (m *SlaveWasPromotedRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SlaveWasPromotedRequest.Unmarshal(m, b) @@ -3115,7 +3115,7 @@ func (m *SlaveWasPromotedResponse) Reset() { *m = SlaveWasPromotedRespon func (m *SlaveWasPromotedResponse) String() string { return proto.CompactTextString(m) } func (*SlaveWasPromotedResponse) ProtoMessage() {} func (*SlaveWasPromotedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{79} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{79} } func (m *SlaveWasPromotedResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SlaveWasPromotedResponse.Unmarshal(m, b) @@ -3148,7 +3148,7 @@ func (m *SetMasterRequest) Reset() { *m = SetMasterRequest{} } func (m *SetMasterRequest) String() string { return proto.CompactTextString(m) } func (*SetMasterRequest) ProtoMessage() {} func (*SetMasterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{80} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{80} } func (m *SetMasterRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetMasterRequest.Unmarshal(m, b) @@ -3199,7 +3199,7 @@ func (m *SetMasterResponse) Reset() { *m = SetMasterResponse{} } func (m *SetMasterResponse) String() string { return proto.CompactTextString(m) } func (*SetMasterResponse) ProtoMessage() {} func (*SetMasterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{81} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{81} } func (m *SetMasterResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SetMasterResponse.Unmarshal(m, b) @@ -3231,7 +3231,7 @@ func (m *SlaveWasRestartedRequest) Reset() { *m = SlaveWasRestartedReque func (m *SlaveWasRestartedRequest) String() string { return proto.CompactTextString(m) } func (*SlaveWasRestartedRequest) ProtoMessage() {} func (*SlaveWasRestartedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{82} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{82} } func (m *SlaveWasRestartedRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SlaveWasRestartedRequest.Unmarshal(m, b) @@ -3268,7 +3268,7 @@ func (m *SlaveWasRestartedResponse) Reset() { *m = SlaveWasRestartedResp func (m *SlaveWasRestartedResponse) String() string { return proto.CompactTextString(m) } func (*SlaveWasRestartedResponse) ProtoMessage() {} func (*SlaveWasRestartedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{83} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{83} } func (m *SlaveWasRestartedResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SlaveWasRestartedResponse.Unmarshal(m, b) @@ -3298,7 +3298,7 @@ func (m *StopReplicationAndGetStatusRequest) Reset() { *m = StopReplicat func (m *StopReplicationAndGetStatusRequest) String() string { return proto.CompactTextString(m) } func (*StopReplicationAndGetStatusRequest) ProtoMessage() {} func (*StopReplicationAndGetStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{84} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{84} } func (m *StopReplicationAndGetStatusRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopReplicationAndGetStatusRequest.Unmarshal(m, b) @@ -3329,7 +3329,7 @@ func (m *StopReplicationAndGetStatusResponse) Reset() { *m = StopReplica func (m *StopReplicationAndGetStatusResponse) String() string { return proto.CompactTextString(m) } func (*StopReplicationAndGetStatusResponse) ProtoMessage() {} func (*StopReplicationAndGetStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{85} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{85} } func (m *StopReplicationAndGetStatusResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopReplicationAndGetStatusResponse.Unmarshal(m, b) @@ -3366,7 +3366,7 @@ func (m *PromoteSlaveRequest) Reset() { *m = PromoteSlaveRequest{} } func (m *PromoteSlaveRequest) String() string { return proto.CompactTextString(m) } func (*PromoteSlaveRequest) ProtoMessage() {} func (*PromoteSlaveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{86} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{86} } func (m *PromoteSlaveRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PromoteSlaveRequest.Unmarshal(m, b) @@ -3397,7 +3397,7 @@ func (m *PromoteSlaveResponse) Reset() { *m = PromoteSlaveResponse{} } func (m *PromoteSlaveResponse) String() string { return proto.CompactTextString(m) } func (*PromoteSlaveResponse) ProtoMessage() {} func (*PromoteSlaveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{87} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{87} } func (m *PromoteSlaveResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PromoteSlaveResponse.Unmarshal(m, b) @@ -3426,6 +3426,7 @@ func (m *PromoteSlaveResponse) GetPosition() string { type BackupRequest struct { Concurrency int64 `protobuf:"varint,1,opt,name=concurrency,proto3" json:"concurrency,omitempty"` + AllowMaster bool `protobuf:"varint,2,opt,name=allowMaster,proto3" json:"allowMaster,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3435,7 +3436,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{88} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{88} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BackupRequest.Unmarshal(m, b) @@ -3462,6 +3463,13 @@ func (m *BackupRequest) GetConcurrency() int64 { return 0 } +func (m *BackupRequest) GetAllowMaster() bool { + if m != nil { + return m.AllowMaster + } + return false +} + type BackupResponse struct { Event *logutil.Event `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3473,7 +3481,7 @@ func (m *BackupResponse) Reset() { *m = BackupResponse{} } func (m *BackupResponse) String() string { return proto.CompactTextString(m) } func (*BackupResponse) ProtoMessage() {} func (*BackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{89} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{89} } func (m *BackupResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BackupResponse.Unmarshal(m, b) @@ -3510,7 +3518,7 @@ func (m *RestoreFromBackupRequest) Reset() { *m = RestoreFromBackupReque func (m *RestoreFromBackupRequest) String() string { return proto.CompactTextString(m) } func (*RestoreFromBackupRequest) ProtoMessage() {} func (*RestoreFromBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{90} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{90} } func (m *RestoreFromBackupRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RestoreFromBackupRequest.Unmarshal(m, b) @@ -3541,7 +3549,7 @@ func (m *RestoreFromBackupResponse) Reset() { *m = RestoreFromBackupResp func (m *RestoreFromBackupResponse) String() string { return proto.CompactTextString(m) } func (*RestoreFromBackupResponse) ProtoMessage() {} func (*RestoreFromBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tabletmanagerdata_9e0123608316bc1a, []int{91} + return fileDescriptor_tabletmanagerdata_364d5b5f7d776524, []int{91} } func (m *RestoreFromBackupResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RestoreFromBackupResponse.Unmarshal(m, b) @@ -3667,138 +3675,138 @@ func init() { } func init() { - proto.RegisterFile("tabletmanagerdata.proto", fileDescriptor_tabletmanagerdata_9e0123608316bc1a) + proto.RegisterFile("tabletmanagerdata.proto", fileDescriptor_tabletmanagerdata_364d5b5f7d776524) } -var fileDescriptor_tabletmanagerdata_9e0123608316bc1a = []byte{ - // 2050 bytes of a gzipped FileDescriptorProto +var fileDescriptor_tabletmanagerdata_364d5b5f7d776524 = []byte{ + // 2061 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x5b, 0x6f, 0x1b, 0xc7, - 0x15, 0x06, 0x49, 0x49, 0x96, 0x0e, 0x2f, 0x22, 0x97, 0x94, 0x48, 0xc9, 0x8d, 0x24, 0xaf, 0x9d, - 0xc6, 0x75, 0x51, 0x2a, 0x56, 0xd2, 0x20, 0x48, 0x91, 0xa2, 0xb2, 0x2e, 0xb6, 0x13, 0x25, 0x56, - 0x56, 0xbe, 0x14, 0x41, 0x81, 0xc5, 0x70, 0x77, 0x44, 0x2e, 0xb4, 0xdc, 0x59, 0xcf, 0xcc, 0x52, - 0xe2, 0x9f, 0xe8, 0x5b, 0xdf, 0xfa, 0x56, 0xa0, 0x7d, 0xef, 0x8f, 0x49, 0xd1, 0x5f, 0xd2, 0x87, - 0xbe, 0x14, 0x73, 0x59, 0x72, 0x96, 0x17, 0x5b, 0x12, 0x5c, 0x20, 0x2f, 0xc6, 0x9e, 0x6f, 0xce, - 0x7d, 0xce, 0x39, 0x73, 0x68, 0x41, 0x93, 0xa3, 0x4e, 0x88, 0x79, 0x1f, 0x45, 0xa8, 0x8b, 0xa9, - 0x8f, 0x38, 0x6a, 0xc7, 0x94, 0x70, 0x62, 0xd5, 0xa6, 0x0e, 0x36, 0x8b, 0x6f, 0x13, 0x4c, 0x87, - 0xea, 0x7c, 0xb3, 0xc2, 0x49, 0x4c, 0xc6, 0xfc, 0x9b, 0x6b, 0x14, 0xc7, 0x61, 0xe0, 0x21, 0x1e, - 0x90, 0xc8, 0x80, 0xcb, 0x21, 0xe9, 0x26, 0x3c, 0x08, 0x15, 0x69, 0xff, 0x3b, 0x07, 0xab, 0x2f, - 0x85, 0xe2, 0x43, 0x7c, 0x1e, 0x44, 0x81, 0x60, 0xb6, 0x2c, 0x58, 0x88, 0x50, 0x1f, 0xb7, 0x72, - 0x3b, 0xb9, 0x87, 0x2b, 0x8e, 0xfc, 0xb6, 0xd6, 0x61, 0x89, 0x79, 0x3d, 0xdc, 0x47, 0xad, 0xbc, - 0x44, 0x35, 0x65, 0xb5, 0xe0, 0x8e, 0x47, 0xc2, 0xa4, 0x1f, 0xb1, 0x56, 0x61, 0xa7, 0xf0, 0x70, - 0xc5, 0x49, 0x49, 0xab, 0x0d, 0xf5, 0x98, 0x06, 0x7d, 0x44, 0x87, 0xee, 0x05, 0x1e, 0xba, 0x29, - 0xd7, 0x82, 0xe4, 0xaa, 0xe9, 0xa3, 0x6f, 0xf1, 0xf0, 0x40, 0xf3, 0x5b, 0xb0, 0xc0, 0x87, 0x31, - 0x6e, 0x2d, 0x2a, 0xab, 0xe2, 0xdb, 0xda, 0x86, 0xa2, 0x70, 0xdd, 0x0d, 0x71, 0xd4, 0xe5, 0xbd, - 0xd6, 0xd2, 0x4e, 0xee, 0xe1, 0x82, 0x03, 0x02, 0x3a, 0x91, 0x88, 0x75, 0x17, 0x56, 0x28, 0xb9, - 0x74, 0x3d, 0x92, 0x44, 0xbc, 0x75, 0x47, 0x1e, 0x2f, 0x53, 0x72, 0x79, 0x20, 0x68, 0xfb, 0xef, - 0x39, 0xa8, 0x9e, 0x49, 0x37, 0x8d, 0xe0, 0x3e, 0x81, 0x55, 0x21, 0xdf, 0x41, 0x0c, 0xbb, 0x3a, - 0x22, 0x15, 0x67, 0x25, 0x85, 0x95, 0x88, 0xf5, 0x02, 0x54, 0xc6, 0x5d, 0x7f, 0x24, 0xcc, 0x5a, - 0xf9, 0x9d, 0xc2, 0xc3, 0xe2, 0x9e, 0xdd, 0x9e, 0xbe, 0xa4, 0x89, 0x24, 0x3a, 0x55, 0x9e, 0x05, - 0x98, 0x48, 0xd5, 0x00, 0x53, 0x16, 0x90, 0xa8, 0x55, 0x90, 0x16, 0x53, 0x52, 0x38, 0x6a, 0x29, - 0xab, 0x07, 0x3d, 0x14, 0x75, 0xb1, 0x83, 0x59, 0x12, 0x72, 0xeb, 0x19, 0x94, 0x3b, 0xf8, 0x9c, - 0xd0, 0x8c, 0xa3, 0xc5, 0xbd, 0xfb, 0x33, 0xac, 0x4f, 0x86, 0xe9, 0x94, 0x94, 0xa4, 0x8e, 0xe5, - 0x18, 0x4a, 0xe8, 0x9c, 0x63, 0xea, 0x1a, 0x77, 0x78, 0x4d, 0x45, 0x45, 0x29, 0xa8, 0x60, 0xfb, - 0x3f, 0x39, 0xa8, 0xbc, 0x62, 0x98, 0x9e, 0x62, 0xda, 0x0f, 0x18, 0xd3, 0xc5, 0xd2, 0x23, 0x8c, - 0xa7, 0xc5, 0x22, 0xbe, 0x05, 0x96, 0x30, 0x4c, 0x75, 0xa9, 0xc8, 0x6f, 0xeb, 0xd7, 0x50, 0x8b, - 0x11, 0x63, 0x97, 0x84, 0xfa, 0xae, 0xd7, 0xc3, 0xde, 0x05, 0x4b, 0xfa, 0x32, 0x0f, 0x0b, 0x4e, - 0x35, 0x3d, 0x38, 0xd0, 0xb8, 0xf5, 0x03, 0x40, 0x4c, 0x83, 0x41, 0x10, 0xe2, 0x2e, 0x56, 0x25, - 0x53, 0xdc, 0x7b, 0x3c, 0xc3, 0xdb, 0xac, 0x2f, 0xed, 0xd3, 0x91, 0xcc, 0x51, 0xc4, 0xe9, 0xd0, - 0x31, 0x94, 0x6c, 0x7e, 0x0d, 0xab, 0x13, 0xc7, 0x56, 0x15, 0x0a, 0x17, 0x78, 0xa8, 0x3d, 0x17, - 0x9f, 0x56, 0x03, 0x16, 0x07, 0x28, 0x4c, 0xb0, 0xf6, 0x5c, 0x11, 0x5f, 0xe5, 0xbf, 0xcc, 0xd9, - 0x3f, 0xe5, 0xa0, 0x74, 0xd8, 0x79, 0x4f, 0xdc, 0x15, 0xc8, 0xfb, 0x1d, 0x2d, 0x9b, 0xf7, 0x3b, - 0xa3, 0x3c, 0x14, 0x8c, 0x3c, 0xbc, 0x98, 0x11, 0xda, 0xee, 0x8c, 0xd0, 0x4c, 0x63, 0xff, 0xcf, - 0xc0, 0xfe, 0x96, 0x83, 0xe2, 0xd8, 0x12, 0xb3, 0x4e, 0xa0, 0x2a, 0xfc, 0x74, 0xe3, 0x31, 0xd6, - 0xca, 0x49, 0x2f, 0xef, 0xbd, 0xf7, 0x02, 0x9c, 0xd5, 0x24, 0x43, 0x33, 0xeb, 0x18, 0x2a, 0x7e, - 0x27, 0xa3, 0x4b, 0x75, 0xd0, 0xf6, 0x7b, 0x22, 0x76, 0xca, 0xbe, 0x41, 0x31, 0xfb, 0x13, 0x28, - 0x9e, 0x06, 0x51, 0xd7, 0xc1, 0x6f, 0x13, 0xcc, 0xb8, 0x68, 0xa5, 0x18, 0x0d, 0x43, 0x82, 0x7c, - 0x1d, 0x64, 0x4a, 0xda, 0x0f, 0xa1, 0xa4, 0x18, 0x59, 0x4c, 0x22, 0x86, 0xdf, 0xc1, 0xf9, 0x08, - 0x4a, 0x67, 0x21, 0xc6, 0x71, 0xaa, 0x73, 0x13, 0x96, 0xfd, 0x84, 0xca, 0x71, 0x29, 0x59, 0x0b, - 0xce, 0x88, 0xb6, 0x57, 0xa1, 0xac, 0x79, 0x95, 0x5a, 0xfb, 0x5f, 0x39, 0xb0, 0x8e, 0xae, 0xb0, - 0x97, 0x70, 0xfc, 0x8c, 0x90, 0x8b, 0x54, 0xc7, 0xac, 0xc9, 0xb9, 0x05, 0x10, 0x23, 0x8a, 0xfa, - 0x98, 0x63, 0xaa, 0xc2, 0x5f, 0x71, 0x0c, 0xc4, 0x3a, 0x85, 0x15, 0x7c, 0xc5, 0x29, 0x72, 0x71, - 0x34, 0x90, 0x33, 0xb4, 0xb8, 0xf7, 0xd9, 0x8c, 0xec, 0x4c, 0x5b, 0x6b, 0x1f, 0x09, 0xb1, 0xa3, - 0x68, 0xa0, 0x6a, 0x62, 0x19, 0x6b, 0x72, 0xf3, 0x77, 0x50, 0xce, 0x1c, 0xdd, 0xa8, 0x1e, 0xce, - 0xa1, 0x9e, 0x31, 0xa5, 0xf3, 0xb8, 0x0d, 0x45, 0x7c, 0x15, 0x70, 0x97, 0x71, 0xc4, 0x13, 0xa6, - 0x13, 0x04, 0x02, 0x3a, 0x93, 0x88, 0x7c, 0x20, 0xb8, 0x4f, 0x12, 0x3e, 0x7a, 0x20, 0x24, 0xa5, - 0x71, 0x4c, 0xd3, 0x2e, 0xd0, 0x94, 0x3d, 0x80, 0xea, 0x53, 0xcc, 0xd5, 0x5c, 0x49, 0xd3, 0xb7, - 0x0e, 0x4b, 0x32, 0x70, 0x55, 0x71, 0x2b, 0x8e, 0xa6, 0xac, 0xfb, 0x50, 0x0e, 0x22, 0x2f, 0x4c, - 0x7c, 0xec, 0x0e, 0x02, 0x7c, 0xc9, 0xa4, 0x89, 0x65, 0xa7, 0xa4, 0xc1, 0xd7, 0x02, 0xb3, 0x3e, - 0x86, 0x0a, 0xbe, 0x52, 0x4c, 0x5a, 0x89, 0x7a, 0x90, 0xca, 0x1a, 0x95, 0x03, 0x9a, 0xd9, 0x18, - 0x6a, 0x86, 0x5d, 0x1d, 0xdd, 0x29, 0xd4, 0xd4, 0x64, 0x34, 0x86, 0xfd, 0x4d, 0xa6, 0x6d, 0x95, - 0x4d, 0x20, 0x76, 0x13, 0xd6, 0x9e, 0x62, 0x6e, 0x94, 0xb0, 0x8e, 0xd1, 0xfe, 0x11, 0xd6, 0x27, - 0x0f, 0xb4, 0x13, 0x7f, 0x80, 0x62, 0xb6, 0xe9, 0x84, 0xf9, 0xad, 0x19, 0xe6, 0x4d, 0x61, 0x53, - 0xc4, 0x6e, 0x80, 0x75, 0x86, 0xb9, 0x83, 0x91, 0xff, 0x22, 0x0a, 0x87, 0xa9, 0xc5, 0x35, 0xa8, - 0x67, 0x50, 0x5d, 0xc2, 0x63, 0xf8, 0x0d, 0x0d, 0x38, 0x4e, 0xb9, 0xd7, 0xa1, 0x91, 0x85, 0x35, - 0xfb, 0x37, 0x50, 0x53, 0x8f, 0xd3, 0xcb, 0x61, 0x9c, 0x32, 0x5b, 0xbf, 0x85, 0xa2, 0x72, 0xcf, - 0x95, 0x4f, 0xb7, 0x70, 0xb9, 0xb2, 0xd7, 0x68, 0x8f, 0x36, 0x11, 0x99, 0x73, 0x2e, 0x25, 0x80, - 0x8f, 0xbe, 0x85, 0x9f, 0xa6, 0xae, 0xb1, 0x43, 0x0e, 0x3e, 0xa7, 0x98, 0xf5, 0x44, 0x49, 0x99, - 0x0e, 0x65, 0x61, 0xcd, 0xde, 0x84, 0x35, 0x27, 0x89, 0x9e, 0x61, 0x14, 0xf2, 0x9e, 0x7c, 0x38, - 0x52, 0x81, 0x16, 0xac, 0x4f, 0x1e, 0x68, 0x91, 0xcf, 0xa1, 0xf5, 0xbc, 0x1b, 0x11, 0x8a, 0xd5, - 0xe1, 0x11, 0xa5, 0x84, 0x66, 0x46, 0x0a, 0xe7, 0x98, 0x46, 0xe3, 0x41, 0x21, 0x49, 0xfb, 0x2e, - 0x6c, 0xcc, 0x90, 0xd2, 0x2a, 0xbf, 0x12, 0x4e, 0x8b, 0x79, 0x92, 0xad, 0xe4, 0xfb, 0x50, 0xbe, - 0x44, 0x01, 0x77, 0x63, 0xc2, 0xc6, 0xc5, 0xb4, 0xe2, 0x94, 0x04, 0x78, 0xaa, 0x31, 0x15, 0x99, - 0x29, 0xab, 0x75, 0xee, 0xc1, 0xfa, 0x29, 0xc5, 0xe7, 0x61, 0xd0, 0xed, 0x4d, 0x34, 0x88, 0xd8, - 0xb6, 0x64, 0xe2, 0xd2, 0x0e, 0x49, 0x49, 0xbb, 0x0b, 0xcd, 0x29, 0x19, 0x5d, 0x57, 0x27, 0x50, - 0x51, 0x5c, 0x2e, 0x95, 0x7b, 0x45, 0x3a, 0xcf, 0x3f, 0x9e, 0x5b, 0xd9, 0xe6, 0x16, 0xe2, 0x94, - 0x3d, 0x83, 0x62, 0xf6, 0x7f, 0x73, 0x60, 0xed, 0xc7, 0x71, 0x38, 0xcc, 0x7a, 0x56, 0x85, 0x02, - 0x7b, 0x1b, 0xa6, 0x23, 0x86, 0xbd, 0x0d, 0xc5, 0x88, 0x39, 0x27, 0xd4, 0xc3, 0xba, 0x59, 0x15, - 0x21, 0xd6, 0x00, 0x14, 0x86, 0xe4, 0xd2, 0x35, 0xb6, 0x53, 0x39, 0x19, 0x96, 0x9d, 0xaa, 0x3c, - 0x70, 0xc6, 0xf8, 0xf4, 0x02, 0xb4, 0xf0, 0xa1, 0x16, 0xa0, 0xc5, 0x5b, 0x2e, 0x40, 0xff, 0xc8, - 0x41, 0x3d, 0x13, 0xbd, 0xce, 0xf1, 0xcf, 0x6f, 0x55, 0xab, 0x43, 0xed, 0x84, 0x78, 0x17, 0x6a, - 0xea, 0xa5, 0xad, 0xd1, 0x00, 0xcb, 0x04, 0xc7, 0x8d, 0xf7, 0x2a, 0x0a, 0xa7, 0x98, 0xd7, 0xa1, - 0x91, 0x85, 0x35, 0xfb, 0x3f, 0x73, 0xd0, 0xd2, 0x4f, 0xc4, 0x31, 0xe6, 0x5e, 0x6f, 0x9f, 0x1d, - 0x76, 0x46, 0x75, 0xd0, 0x80, 0x45, 0xf9, 0xa3, 0x44, 0x26, 0xa0, 0xe4, 0x28, 0xc2, 0x6a, 0xc2, - 0x1d, 0xbf, 0xe3, 0xca, 0xa7, 0x51, 0xbf, 0x0e, 0x7e, 0xe7, 0x7b, 0xf1, 0x38, 0x6e, 0xc0, 0x72, - 0x1f, 0x5d, 0xb9, 0x94, 0x5c, 0x32, 0xbd, 0x0c, 0xde, 0xe9, 0xa3, 0x2b, 0x87, 0x5c, 0x32, 0xb9, - 0xa8, 0x07, 0x4c, 0x6e, 0xe0, 0x9d, 0x20, 0x0a, 0x49, 0x97, 0xc9, 0xeb, 0x5f, 0x76, 0x2a, 0x1a, - 0x7e, 0xa2, 0x50, 0xd1, 0x6b, 0x54, 0xb6, 0x91, 0x79, 0xb9, 0xcb, 0x4e, 0x89, 0x1a, 0xbd, 0x65, - 0x3f, 0x85, 0x8d, 0x19, 0x3e, 0xeb, 0xdb, 0x7b, 0x04, 0x4b, 0xaa, 0x35, 0xf4, 0xb5, 0x59, 0x6d, - 0xf5, 0xc3, 0xea, 0x07, 0xf1, 0xaf, 0x6e, 0x03, 0xcd, 0x61, 0xff, 0x39, 0x07, 0x1f, 0x65, 0x35, - 0xed, 0x87, 0xa1, 0x58, 0xc0, 0xd8, 0x87, 0x4f, 0xc1, 0x54, 0x64, 0x0b, 0x33, 0x22, 0x3b, 0x81, - 0xad, 0x79, 0xfe, 0xdc, 0x22, 0xbc, 0x6f, 0x27, 0xef, 0x76, 0x3f, 0x8e, 0xdf, 0x1d, 0x98, 0xe9, - 0x7f, 0x3e, 0xe3, 0xff, 0x74, 0xd2, 0xa5, 0xb2, 0x5b, 0x78, 0x25, 0x1e, 0xb6, 0x10, 0x0d, 0xb0, - 0xda, 0x35, 0xd2, 0x02, 0x3d, 0x86, 0x7a, 0x06, 0xd5, 0x8a, 0x77, 0xc5, 0xc6, 0x31, 0xda, 0x52, - 0x8a, 0x7b, 0xcd, 0xf6, 0xe4, 0x2f, 0x61, 0x2d, 0xa0, 0xd9, 0xc4, 0x4b, 0xf2, 0x1d, 0x62, 0x1c, - 0xd3, 0x74, 0x32, 0xa7, 0x06, 0x3e, 0x87, 0xf5, 0xc9, 0x03, 0x6d, 0x63, 0x13, 0x96, 0x27, 0x46, - 0xfb, 0x88, 0xb6, 0x2d, 0xa8, 0x9e, 0x71, 0x12, 0x4b, 0xd7, 0x52, 0x4d, 0x75, 0xa8, 0x19, 0x98, - 0x6e, 0xa4, 0x3f, 0x42, 0x73, 0x04, 0x7e, 0x17, 0x44, 0x41, 0x3f, 0xe9, 0x1b, 0xcb, 0xe8, 0x3c, - 0xfd, 0xd6, 0x3d, 0x90, 0xcf, 0x88, 0xcb, 0x83, 0x3e, 0x4e, 0xf7, 0xad, 0x82, 0x53, 0x14, 0xd8, - 0x4b, 0x05, 0xd9, 0x5f, 0x40, 0x6b, 0x5a, 0xf3, 0x35, 0x5c, 0x97, 0x6e, 0x22, 0xca, 0x33, 0xbe, - 0x8b, 0xe4, 0x1b, 0xa0, 0x76, 0xfe, 0x4f, 0x70, 0x77, 0x8c, 0xbe, 0x8a, 0x78, 0x10, 0xee, 0x8b, - 0xe9, 0xf3, 0x81, 0x02, 0xd8, 0x82, 0x5f, 0xcc, 0xd6, 0xae, 0xad, 0x1f, 0xc2, 0x3d, 0xb5, 0x5b, - 0x1c, 0x5d, 0x89, 0x37, 0x1a, 0x85, 0x62, 0xb1, 0x89, 0x11, 0xc5, 0x11, 0xc7, 0x7e, 0xea, 0x83, - 0xdc, 0x59, 0xd5, 0xb1, 0x1b, 0xa4, 0xfb, 0x3f, 0xa4, 0xd0, 0x73, 0xdf, 0x7e, 0x00, 0xf6, 0xbb, - 0xb4, 0x68, 0x5b, 0x3b, 0xb0, 0x35, 0xc9, 0x75, 0x14, 0x62, 0x6f, 0x6c, 0xc8, 0xbe, 0x07, 0xdb, - 0x73, 0x39, 0xb4, 0x12, 0x4b, 0xad, 0xbb, 0x22, 0x9c, 0x51, 0xfd, 0xfe, 0x4a, 0xad, 0xa2, 0x1a, - 0xd3, 0xd7, 0xd3, 0x80, 0x45, 0xe4, 0xfb, 0x34, 0x7d, 0xe0, 0x15, 0x61, 0x6f, 0x40, 0xd3, 0xc1, - 0x4c, 0xec, 0x65, 0xa3, 0x4a, 0x4e, 0xb5, 0x6c, 0x42, 0x6b, 0xfa, 0x48, 0x5b, 0xdd, 0x85, 0xe6, - 0x6b, 0x03, 0x17, 0xcd, 0x38, 0xb3, 0x99, 0x57, 0x74, 0x33, 0xdb, 0xc7, 0xd0, 0x9a, 0x16, 0xb8, - 0xd5, 0x18, 0xf9, 0xc8, 0xd4, 0xf3, 0x06, 0x05, 0xfc, 0x98, 0x88, 0x36, 0x4a, 0xcd, 0x57, 0x20, - 0xaf, 0xaf, 0xa4, 0xe0, 0xe4, 0x03, 0x3f, 0x53, 0x2f, 0xf9, 0x89, 0xaa, 0xdc, 0x81, 0xad, 0x79, - 0xca, 0x74, 0x9c, 0x75, 0xa8, 0x3d, 0x8f, 0x02, 0xae, 0x9a, 0x35, 0x4d, 0xcc, 0xa7, 0x60, 0x99, - 0xe0, 0x35, 0xca, 0xff, 0xa7, 0x1c, 0x6c, 0x9d, 0x92, 0x38, 0x09, 0xe5, 0x9e, 0xa9, 0x0a, 0xe1, - 0x1b, 0x92, 0x88, 0x1b, 0x4d, 0xfd, 0xfe, 0x25, 0xac, 0x8a, 0xb2, 0x75, 0x3d, 0x8a, 0x11, 0xc7, - 0xbe, 0x1b, 0xa5, 0xbf, 0x85, 0xca, 0x02, 0x3e, 0x50, 0xe8, 0xf7, 0x4c, 0xd4, 0x1e, 0xf2, 0x84, - 0x52, 0x73, 0xe4, 0x83, 0x82, 0xe4, 0xd8, 0xff, 0x12, 0x4a, 0x7d, 0xe9, 0x99, 0x8b, 0xc2, 0x00, - 0xa9, 0xd1, 0x5f, 0xdc, 0x5b, 0x9b, 0xdc, 0x9d, 0xf7, 0xc5, 0xa1, 0x53, 0x54, 0xac, 0x92, 0xb0, - 0x1e, 0x43, 0xc3, 0x18, 0x68, 0xe3, 0x15, 0x73, 0x41, 0xda, 0xa8, 0x1b, 0x67, 0xa3, 0x4d, 0xf3, - 0x1e, 0x6c, 0xcf, 0x8d, 0x4b, 0xa7, 0xf0, 0xaf, 0x39, 0xa8, 0x8a, 0x74, 0x99, 0xad, 0x6f, 0xfd, - 0x06, 0x96, 0x14, 0xb7, 0xbe, 0xf2, 0x39, 0xee, 0x69, 0xa6, 0xb9, 0x9e, 0xe5, 0xe7, 0x7a, 0x36, - 0x2b, 0x9f, 0x85, 0x19, 0xf9, 0x4c, 0x6f, 0x38, 0x3b, 0x83, 0xd6, 0xa0, 0x7e, 0x88, 0xfb, 0x84, - 0xe3, 0xec, 0xc5, 0xef, 0x41, 0x23, 0x0b, 0x5f, 0xe3, 0xea, 0xbf, 0x86, 0xed, 0x53, 0x4a, 0x84, - 0x90, 0x34, 0xf1, 0xa6, 0x87, 0xa3, 0x03, 0x94, 0x74, 0x7b, 0xfc, 0x55, 0x7c, 0x8d, 0x91, 0x66, - 0xff, 0x1e, 0x76, 0xe6, 0x8b, 0x5f, 0xc3, 0xfc, 0x06, 0x34, 0x95, 0x20, 0x62, 0x5a, 0x8f, 0x6f, - 0xf4, 0xf7, 0xf4, 0x91, 0x4e, 0xc0, 0x5f, 0x72, 0x50, 0x3d, 0xc3, 0xd9, 0xba, 0xbf, 0xe9, 0xa5, - 0xcd, 0xb8, 0x81, 0xfc, 0xac, 0x8a, 0x7e, 0x04, 0x35, 0xb9, 0xc2, 0xbb, 0x4c, 0x0c, 0x66, 0x97, - 0x09, 0x9f, 0xf4, 0xe6, 0xbe, 0x2a, 0x0f, 0xc6, 0x03, 0x5b, 0xbe, 0x23, 0x78, 0xa2, 0xf3, 0xec, - 0xe7, 0xe3, 0x40, 0x1c, 0x2c, 0x95, 0x8c, 0x47, 0xf5, 0xcd, 0x7c, 0x16, 0x3f, 0xc9, 0x66, 0xa8, - 0xd2, 0x76, 0x1e, 0x80, 0x2d, 0x1e, 0x3f, 0x63, 0x62, 0xec, 0x47, 0xbe, 0x18, 0xb4, 0x99, 0xe5, - 0xe1, 0x35, 0xdc, 0x7f, 0x27, 0xd7, 0x6d, 0x97, 0x89, 0x35, 0xa8, 0x9b, 0x95, 0x60, 0xd4, 0x64, - 0x16, 0xbe, 0x46, 0x51, 0x3c, 0x86, 0xf2, 0x13, 0xe4, 0x5d, 0x24, 0xa3, 0x0a, 0xdc, 0x81, 0xa2, - 0x47, 0x22, 0x2f, 0xa1, 0x14, 0x47, 0xde, 0x50, 0x0f, 0x1e, 0x13, 0xb2, 0xbf, 0x80, 0x4a, 0x2a, - 0xa2, 0x0d, 0x3c, 0x80, 0x45, 0x3c, 0x18, 0x27, 0xb6, 0xd2, 0x4e, 0xff, 0xff, 0xff, 0x48, 0xa0, - 0x8e, 0x3a, 0xd4, 0x8f, 0x08, 0x27, 0x14, 0x1f, 0x53, 0xd2, 0xcf, 0x58, 0xb5, 0xf7, 0x61, 0x63, - 0xc6, 0xd9, 0x4d, 0xd4, 0x3f, 0xf9, 0xf4, 0xc7, 0xf6, 0x20, 0xe0, 0x98, 0xb1, 0x76, 0x40, 0x76, - 0xd5, 0xd7, 0x6e, 0x97, 0xec, 0x0e, 0xf8, 0xae, 0xfc, 0x2b, 0xc4, 0xee, 0xd4, 0x8f, 0x9b, 0xce, - 0x92, 0x3c, 0xf8, 0xec, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x30, 0x7f, 0x51, 0x40, 0x0f, 0x19, - 0x00, 0x00, + 0xf5, 0x07, 0x49, 0x49, 0x96, 0x0e, 0x2f, 0x22, 0x97, 0x94, 0x48, 0xc9, 0xff, 0x48, 0xf2, 0xda, + 0xf9, 0x47, 0x75, 0x51, 0x2a, 0x51, 0xd2, 0x20, 0x48, 0x91, 0xa2, 0xb2, 0x2e, 0xb6, 0x13, 0x25, + 0x56, 0x56, 0xbe, 0x14, 0x41, 0x81, 0xc5, 0x70, 0x77, 0x44, 0x2e, 0xb4, 0xdc, 0x59, 0xcf, 0xcc, + 0x52, 0xe2, 0x97, 0xe8, 0x5b, 0xdf, 0xfa, 0x56, 0xa0, 0x7d, 0xef, 0x87, 0x49, 0xd1, 0x4f, 0xd2, + 0x87, 0xbe, 0x14, 0x73, 0x59, 0x72, 0x96, 0x17, 0x5b, 0x12, 0x5c, 0xa0, 0x2f, 0x02, 0xcf, 0x6f, + 0xce, 0x7d, 0xce, 0x39, 0x73, 0x16, 0x82, 0x26, 0x47, 0x9d, 0x10, 0xf3, 0x3e, 0x8a, 0x50, 0x17, + 0x53, 0x1f, 0x71, 0xd4, 0x8e, 0x29, 0xe1, 0xc4, 0xaa, 0x4d, 0x1d, 0x6c, 0x16, 0xdf, 0x26, 0x98, + 0x0e, 0xd5, 0xf9, 0x66, 0x85, 0x93, 0x98, 0x8c, 0xf9, 0x37, 0xd7, 0x28, 0x8e, 0xc3, 0xc0, 0x43, + 0x3c, 0x20, 0x91, 0x01, 0x97, 0x43, 0xd2, 0x4d, 0x78, 0x10, 0x2a, 0xd2, 0xfe, 0x67, 0x0e, 0x56, + 0x5f, 0x0a, 0xc5, 0x47, 0xf8, 0x22, 0x88, 0x02, 0xc1, 0x6c, 0x59, 0xb0, 0x10, 0xa1, 0x3e, 0x6e, + 0xe5, 0x76, 0x72, 0xbb, 0x2b, 0x8e, 0xfc, 0x6d, 0xad, 0xc3, 0x12, 0xf3, 0x7a, 0xb8, 0x8f, 0x5a, + 0x79, 0x89, 0x6a, 0xca, 0x6a, 0xc1, 0x3d, 0x8f, 0x84, 0x49, 0x3f, 0x62, 0xad, 0xc2, 0x4e, 0x61, + 0x77, 0xc5, 0x49, 0x49, 0xab, 0x0d, 0xf5, 0x98, 0x06, 0x7d, 0x44, 0x87, 0xee, 0x25, 0x1e, 0xba, + 0x29, 0xd7, 0x82, 0xe4, 0xaa, 0xe9, 0xa3, 0xef, 0xf0, 0xf0, 0x50, 0xf3, 0x5b, 0xb0, 0xc0, 0x87, + 0x31, 0x6e, 0x2d, 0x2a, 0xab, 0xe2, 0xb7, 0xb5, 0x0d, 0x45, 0xe1, 0xba, 0x1b, 0xe2, 0xa8, 0xcb, + 0x7b, 0xad, 0xa5, 0x9d, 0xdc, 0xee, 0x82, 0x03, 0x02, 0x3a, 0x95, 0x88, 0x75, 0x1f, 0x56, 0x28, + 0xb9, 0x72, 0x3d, 0x92, 0x44, 0xbc, 0x75, 0x4f, 0x1e, 0x2f, 0x53, 0x72, 0x75, 0x28, 0x68, 0xfb, + 0xaf, 0x39, 0xa8, 0x9e, 0x4b, 0x37, 0x8d, 0xe0, 0x3e, 0x81, 0x55, 0x21, 0xdf, 0x41, 0x0c, 0xbb, + 0x3a, 0x22, 0x15, 0x67, 0x25, 0x85, 0x95, 0x88, 0xf5, 0x02, 0x54, 0xc6, 0x5d, 0x7f, 0x24, 0xcc, + 0x5a, 0xf9, 0x9d, 0xc2, 0x6e, 0x71, 0xdf, 0x6e, 0x4f, 0x5f, 0xd2, 0x44, 0x12, 0x9d, 0x2a, 0xcf, + 0x02, 0x4c, 0xa4, 0x6a, 0x80, 0x29, 0x0b, 0x48, 0xd4, 0x2a, 0x48, 0x8b, 0x29, 0x29, 0x1c, 0xb5, + 0x94, 0xd5, 0xc3, 0x1e, 0x8a, 0xba, 0xd8, 0xc1, 0x2c, 0x09, 0xb9, 0xf5, 0x0c, 0xca, 0x1d, 0x7c, + 0x41, 0x68, 0xc6, 0xd1, 0xe2, 0xfe, 0xc3, 0x19, 0xd6, 0x27, 0xc3, 0x74, 0x4a, 0x4a, 0x52, 0xc7, + 0x72, 0x02, 0x25, 0x74, 0xc1, 0x31, 0x75, 0x8d, 0x3b, 0xbc, 0xa1, 0xa2, 0xa2, 0x14, 0x54, 0xb0, + 0xfd, 0xaf, 0x1c, 0x54, 0x5e, 0x31, 0x4c, 0xcf, 0x30, 0xed, 0x07, 0x8c, 0xe9, 0x62, 0xe9, 0x11, + 0xc6, 0xd3, 0x62, 0x11, 0xbf, 0x05, 0x96, 0x30, 0x4c, 0x75, 0xa9, 0xc8, 0xdf, 0xd6, 0x2f, 0xa1, + 0x16, 0x23, 0xc6, 0xae, 0x08, 0xf5, 0x5d, 0xaf, 0x87, 0xbd, 0x4b, 0x96, 0xf4, 0x65, 0x1e, 0x16, + 0x9c, 0x6a, 0x7a, 0x70, 0xa8, 0x71, 0xeb, 0x47, 0x80, 0x98, 0x06, 0x83, 0x20, 0xc4, 0x5d, 0xac, + 0x4a, 0xa6, 0xb8, 0xff, 0xd9, 0x0c, 0x6f, 0xb3, 0xbe, 0xb4, 0xcf, 0x46, 0x32, 0xc7, 0x11, 0xa7, + 0x43, 0xc7, 0x50, 0xb2, 0xf9, 0x0d, 0xac, 0x4e, 0x1c, 0x5b, 0x55, 0x28, 0x5c, 0xe2, 0xa1, 0xf6, + 0x5c, 0xfc, 0xb4, 0x1a, 0xb0, 0x38, 0x40, 0x61, 0x82, 0xb5, 0xe7, 0x8a, 0xf8, 0x3a, 0xff, 0x55, + 0xce, 0xfe, 0x39, 0x07, 0xa5, 0xa3, 0xce, 0x7b, 0xe2, 0xae, 0x40, 0xde, 0xef, 0x68, 0xd9, 0xbc, + 0xdf, 0x19, 0xe5, 0xa1, 0x60, 0xe4, 0xe1, 0xc5, 0x8c, 0xd0, 0xf6, 0x66, 0x84, 0x66, 0x1a, 0xfb, + 0x6f, 0x06, 0xf6, 0x97, 0x1c, 0x14, 0xc7, 0x96, 0x98, 0x75, 0x0a, 0x55, 0xe1, 0xa7, 0x1b, 0x8f, + 0xb1, 0x56, 0x4e, 0x7a, 0xf9, 0xe0, 0xbd, 0x17, 0xe0, 0xac, 0x26, 0x19, 0x9a, 0x59, 0x27, 0x50, + 0xf1, 0x3b, 0x19, 0x5d, 0xaa, 0x83, 0xb6, 0xdf, 0x13, 0xb1, 0x53, 0xf6, 0x0d, 0x8a, 0xd9, 0x9f, + 0x40, 0xf1, 0x2c, 0x88, 0xba, 0x0e, 0x7e, 0x9b, 0x60, 0xc6, 0x45, 0x2b, 0xc5, 0x68, 0x18, 0x12, + 0xe4, 0xeb, 0x20, 0x53, 0xd2, 0xde, 0x85, 0x92, 0x62, 0x64, 0x31, 0x89, 0x18, 0x7e, 0x07, 0xe7, + 0x63, 0x28, 0x9d, 0x87, 0x18, 0xc7, 0xa9, 0xce, 0x4d, 0x58, 0xf6, 0x13, 0x2a, 0xc7, 0xa5, 0x64, + 0x2d, 0x38, 0x23, 0xda, 0x5e, 0x85, 0xb2, 0xe6, 0x55, 0x6a, 0xed, 0x7f, 0xe4, 0xc0, 0x3a, 0xbe, + 0xc6, 0x5e, 0xc2, 0xf1, 0x33, 0x42, 0x2e, 0x53, 0x1d, 0xb3, 0x26, 0xe7, 0x16, 0x40, 0x8c, 0x28, + 0xea, 0x63, 0x8e, 0xa9, 0x0a, 0x7f, 0xc5, 0x31, 0x10, 0xeb, 0x0c, 0x56, 0xf0, 0x35, 0xa7, 0xc8, + 0xc5, 0xd1, 0x40, 0xce, 0xd0, 0xe2, 0xfe, 0xe7, 0x33, 0xb2, 0x33, 0x6d, 0xad, 0x7d, 0x2c, 0xc4, + 0x8e, 0xa3, 0x81, 0xaa, 0x89, 0x65, 0xac, 0xc9, 0xcd, 0xdf, 0x40, 0x39, 0x73, 0x74, 0xab, 0x7a, + 0xb8, 0x80, 0x7a, 0xc6, 0x94, 0xce, 0xe3, 0x36, 0x14, 0xf1, 0x75, 0xc0, 0x5d, 0xc6, 0x11, 0x4f, + 0x98, 0x4e, 0x10, 0x08, 0xe8, 0x5c, 0x22, 0xf2, 0x81, 0xe0, 0x3e, 0x49, 0xf8, 0xe8, 0x81, 0x90, + 0x94, 0xc6, 0x31, 0x4d, 0xbb, 0x40, 0x53, 0xf6, 0x00, 0xaa, 0x4f, 0x31, 0x57, 0x73, 0x25, 0x4d, + 0xdf, 0x3a, 0x2c, 0xc9, 0xc0, 0x55, 0xc5, 0xad, 0x38, 0x9a, 0xb2, 0x1e, 0x42, 0x39, 0x88, 0xbc, + 0x30, 0xf1, 0xb1, 0x3b, 0x08, 0xf0, 0x15, 0x93, 0x26, 0x96, 0x9d, 0x92, 0x06, 0x5f, 0x0b, 0xcc, + 0xfa, 0x18, 0x2a, 0xf8, 0x5a, 0x31, 0x69, 0x25, 0xea, 0x41, 0x2a, 0x6b, 0x54, 0x0e, 0x68, 0x66, + 0x63, 0xa8, 0x19, 0x76, 0x75, 0x74, 0x67, 0x50, 0x53, 0x93, 0xd1, 0x18, 0xf6, 0xb7, 0x99, 0xb6, + 0x55, 0x36, 0x81, 0xd8, 0x4d, 0x58, 0x7b, 0x8a, 0xb9, 0x51, 0xc2, 0x3a, 0x46, 0xfb, 0x27, 0x58, + 0x9f, 0x3c, 0xd0, 0x4e, 0xfc, 0x0e, 0x8a, 0xd9, 0xa6, 0x13, 0xe6, 0xb7, 0x66, 0x98, 0x37, 0x85, + 0x4d, 0x11, 0xbb, 0x01, 0xd6, 0x39, 0xe6, 0x0e, 0x46, 0xfe, 0x8b, 0x28, 0x1c, 0xa6, 0x16, 0xd7, + 0xa0, 0x9e, 0x41, 0x75, 0x09, 0x8f, 0xe1, 0x37, 0x34, 0xe0, 0x38, 0xe5, 0x5e, 0x87, 0x46, 0x16, + 0xd6, 0xec, 0xdf, 0x42, 0x4d, 0x3d, 0x4e, 0x2f, 0x87, 0x71, 0xca, 0x6c, 0xfd, 0x1a, 0x8a, 0xca, + 0x3d, 0x57, 0x3e, 0xdd, 0xc2, 0xe5, 0xca, 0x7e, 0xa3, 0x3d, 0xda, 0x44, 0x64, 0xce, 0xb9, 0x94, + 0x00, 0x3e, 0xfa, 0x2d, 0xfc, 0x34, 0x75, 0x8d, 0x1d, 0x72, 0xf0, 0x05, 0xc5, 0xac, 0x27, 0x4a, + 0xca, 0x74, 0x28, 0x0b, 0x6b, 0xf6, 0x26, 0xac, 0x39, 0x49, 0xf4, 0x0c, 0xa3, 0x90, 0xf7, 0xe4, + 0xc3, 0x91, 0x0a, 0xb4, 0x60, 0x7d, 0xf2, 0x40, 0x8b, 0x7c, 0x01, 0xad, 0xe7, 0xdd, 0x88, 0x50, + 0xac, 0x0e, 0x8f, 0x29, 0x25, 0x34, 0x33, 0x52, 0x38, 0xc7, 0x34, 0x1a, 0x0f, 0x0a, 0x49, 0xda, + 0xf7, 0x61, 0x63, 0x86, 0x94, 0x56, 0xf9, 0xb5, 0x70, 0x5a, 0xcc, 0x93, 0x6c, 0x25, 0x3f, 0x84, + 0xf2, 0x15, 0x0a, 0xb8, 0x1b, 0x13, 0x36, 0x2e, 0xa6, 0x15, 0xa7, 0x24, 0xc0, 0x33, 0x8d, 0xa9, + 0xc8, 0x4c, 0x59, 0xad, 0x73, 0x1f, 0xd6, 0xcf, 0x28, 0xbe, 0x08, 0x83, 0x6e, 0x6f, 0xa2, 0x41, + 0xc4, 0xb6, 0x25, 0x13, 0x97, 0x76, 0x48, 0x4a, 0xda, 0x5d, 0x68, 0x4e, 0xc9, 0xe8, 0xba, 0x3a, + 0x85, 0x8a, 0xe2, 0x72, 0xa9, 0xdc, 0x2b, 0xd2, 0x79, 0xfe, 0xf1, 0xdc, 0xca, 0x36, 0xb7, 0x10, + 0xa7, 0xec, 0x19, 0x14, 0xb3, 0xff, 0x9d, 0x03, 0xeb, 0x20, 0x8e, 0xc3, 0x61, 0xd6, 0xb3, 0x2a, + 0x14, 0xd8, 0xdb, 0x30, 0x1d, 0x31, 0xec, 0x6d, 0x28, 0x46, 0xcc, 0x05, 0xa1, 0x1e, 0xd6, 0xcd, + 0xaa, 0x08, 0xb1, 0x06, 0xa0, 0x30, 0x24, 0x57, 0xae, 0xb1, 0x9d, 0xca, 0xc9, 0xb0, 0xec, 0x54, + 0xe5, 0x81, 0x33, 0xc6, 0xa7, 0x17, 0xa0, 0x85, 0x0f, 0xb5, 0x00, 0x2d, 0xde, 0x71, 0x01, 0xfa, + 0x5b, 0x0e, 0xea, 0x99, 0xe8, 0x75, 0x8e, 0xff, 0xf7, 0x56, 0xb5, 0x3a, 0xd4, 0x4e, 0x89, 0x77, + 0xa9, 0xa6, 0x5e, 0xda, 0x1a, 0x0d, 0xb0, 0x4c, 0x70, 0xdc, 0x78, 0xaf, 0xa2, 0x70, 0x8a, 0x79, + 0x1d, 0x1a, 0x59, 0x58, 0xb3, 0xff, 0x3d, 0x07, 0x2d, 0xfd, 0x44, 0x9c, 0x60, 0xee, 0xf5, 0x0e, + 0xd8, 0x51, 0x67, 0x54, 0x07, 0x0d, 0x58, 0x94, 0x1f, 0x25, 0x32, 0x01, 0x25, 0x47, 0x11, 0x56, + 0x13, 0xee, 0xf9, 0x1d, 0x57, 0x3e, 0x8d, 0xfa, 0x75, 0xf0, 0x3b, 0x3f, 0x88, 0xc7, 0x71, 0x03, + 0x96, 0xfb, 0xe8, 0xda, 0xa5, 0xe4, 0x8a, 0xe9, 0x65, 0xf0, 0x5e, 0x1f, 0x5d, 0x3b, 0xe4, 0x8a, + 0xc9, 0x45, 0x3d, 0x60, 0x72, 0x03, 0xef, 0x04, 0x51, 0x48, 0xba, 0x4c, 0x5e, 0xff, 0xb2, 0x53, + 0xd1, 0xf0, 0x13, 0x85, 0x8a, 0x5e, 0xa3, 0xb2, 0x8d, 0xcc, 0xcb, 0x5d, 0x76, 0x4a, 0xd4, 0xe8, + 0x2d, 0xfb, 0x29, 0x6c, 0xcc, 0xf0, 0x59, 0xdf, 0xde, 0x63, 0x58, 0x52, 0xad, 0xa1, 0xaf, 0xcd, + 0x6a, 0xab, 0x0f, 0xab, 0x1f, 0xc5, 0x5f, 0xdd, 0x06, 0x9a, 0xc3, 0xfe, 0x63, 0x0e, 0x3e, 0xca, + 0x6a, 0x3a, 0x08, 0x43, 0xb1, 0x80, 0xb1, 0x0f, 0x9f, 0x82, 0xa9, 0xc8, 0x16, 0x66, 0x44, 0x76, + 0x0a, 0x5b, 0xf3, 0xfc, 0xb9, 0x43, 0x78, 0xdf, 0x4d, 0xde, 0xed, 0x41, 0x1c, 0xbf, 0x3b, 0x30, + 0xd3, 0xff, 0x7c, 0xc6, 0xff, 0xe9, 0xa4, 0x4b, 0x65, 0x77, 0xf0, 0x4a, 0x3c, 0x6c, 0x21, 0x1a, + 0x60, 0xb5, 0x6b, 0xa4, 0x05, 0x7a, 0x02, 0xf5, 0x0c, 0xaa, 0x15, 0xef, 0x89, 0x8d, 0x63, 0xb4, + 0xa5, 0x14, 0xf7, 0x9b, 0xed, 0xc9, 0x2f, 0x61, 0x2d, 0xa0, 0xd9, 0xc4, 0x4b, 0xf2, 0x3d, 0x62, + 0x1c, 0xd3, 0x74, 0x32, 0xa7, 0x06, 0xbe, 0x80, 0xf5, 0xc9, 0x03, 0x6d, 0x63, 0x13, 0x96, 0x27, + 0x46, 0xfb, 0x88, 0xb6, 0x2d, 0xa8, 0x9e, 0x73, 0x12, 0x4b, 0xd7, 0x52, 0x4d, 0x75, 0xa8, 0x19, + 0x98, 0x6e, 0xa4, 0xdf, 0x43, 0x73, 0x04, 0x7e, 0x1f, 0x44, 0x41, 0x3f, 0xe9, 0x1b, 0xcb, 0xe8, + 0x3c, 0xfd, 0xd6, 0x03, 0x90, 0xcf, 0x88, 0xcb, 0x83, 0x3e, 0x4e, 0xf7, 0xad, 0x82, 0x53, 0x14, + 0xd8, 0x4b, 0x05, 0xd9, 0x5f, 0x42, 0x6b, 0x5a, 0xf3, 0x0d, 0x5c, 0x97, 0x6e, 0x22, 0xca, 0x33, + 0xbe, 0x8b, 0xe4, 0x1b, 0xa0, 0x76, 0xfe, 0x0f, 0x70, 0x7f, 0x8c, 0xbe, 0x8a, 0x78, 0x10, 0x1e, + 0x88, 0xe9, 0xf3, 0x81, 0x02, 0xd8, 0x82, 0xff, 0x9b, 0xad, 0x5d, 0x5b, 0x3f, 0x82, 0x07, 0x6a, + 0xb7, 0x38, 0xbe, 0x16, 0x6f, 0x34, 0x0a, 0xc5, 0x62, 0x13, 0x23, 0x8a, 0x23, 0x8e, 0xfd, 0xd4, + 0x07, 0xb9, 0xb3, 0xaa, 0x63, 0x37, 0x48, 0xf7, 0x7f, 0x48, 0xa1, 0xe7, 0xbe, 0xfd, 0x08, 0xec, + 0x77, 0x69, 0xd1, 0xb6, 0x76, 0x60, 0x6b, 0x92, 0xeb, 0x38, 0xc4, 0xde, 0xd8, 0x90, 0xfd, 0x00, + 0xb6, 0xe7, 0x72, 0x68, 0x25, 0x96, 0x5a, 0x77, 0x45, 0x38, 0xa3, 0xfa, 0xfd, 0x85, 0x5a, 0x45, + 0x35, 0xa6, 0xaf, 0xa7, 0x01, 0x8b, 0xc8, 0xf7, 0x69, 0xfa, 0xc0, 0x2b, 0xc2, 0xde, 0x80, 0xa6, + 0x83, 0x99, 0xd8, 0xcb, 0x46, 0x95, 0x9c, 0x6a, 0xd9, 0x84, 0xd6, 0xf4, 0x91, 0xb6, 0xba, 0x07, + 0xcd, 0xd7, 0x06, 0x2e, 0x9a, 0x71, 0x66, 0x33, 0xaf, 0xe8, 0x66, 0xb6, 0x4f, 0xa0, 0x35, 0x2d, + 0x70, 0xa7, 0x31, 0xf2, 0x91, 0xa9, 0xe7, 0x0d, 0x0a, 0xf8, 0x09, 0x11, 0x6d, 0x94, 0x9a, 0xaf, + 0x40, 0x5e, 0x5f, 0x49, 0xc1, 0xc9, 0x07, 0x7e, 0xa6, 0x5e, 0xf2, 0x13, 0x55, 0xb9, 0x03, 0x5b, + 0xf3, 0x94, 0xe9, 0x38, 0xeb, 0x50, 0x7b, 0x1e, 0x05, 0x5c, 0x35, 0x6b, 0x9a, 0x98, 0x4f, 0xc1, + 0x32, 0xc1, 0x1b, 0x94, 0xff, 0xcf, 0x39, 0xd8, 0x3a, 0x23, 0x71, 0x12, 0xca, 0x3d, 0x53, 0x15, + 0xc2, 0xb7, 0x24, 0x11, 0x37, 0x9a, 0xfa, 0xfd, 0xff, 0xb0, 0x2a, 0xca, 0xd6, 0xf5, 0x28, 0x46, + 0x1c, 0xfb, 0x6e, 0x94, 0x7e, 0x0b, 0x95, 0x05, 0x7c, 0xa8, 0xd0, 0x1f, 0x98, 0xa8, 0x3d, 0xe4, + 0x09, 0xa5, 0xe6, 0xc8, 0x07, 0x05, 0xc9, 0xb1, 0xff, 0x15, 0x94, 0xfa, 0xd2, 0x33, 0x17, 0x85, + 0x01, 0x52, 0xa3, 0xbf, 0xb8, 0xbf, 0x36, 0xb9, 0x3b, 0x1f, 0x88, 0x43, 0xa7, 0xa8, 0x58, 0x25, + 0x61, 0x7d, 0x06, 0x0d, 0x63, 0xa0, 0x8d, 0x57, 0xcc, 0x05, 0x69, 0xa3, 0x6e, 0x9c, 0x8d, 0x36, + 0xcd, 0x07, 0xb0, 0x3d, 0x37, 0x2e, 0x9d, 0xc2, 0x3f, 0xe7, 0xa0, 0x2a, 0xd2, 0x65, 0xb6, 0xbe, + 0xf5, 0x2b, 0x58, 0x52, 0xdc, 0xfa, 0xca, 0xe7, 0xb8, 0xa7, 0x99, 0xe6, 0x7a, 0x96, 0x9f, 0xeb, + 0xd9, 0xac, 0x7c, 0x16, 0x66, 0xe4, 0x33, 0xbd, 0xe1, 0xec, 0x0c, 0x5a, 0x83, 0xfa, 0x11, 0xee, + 0x13, 0x8e, 0xb3, 0x17, 0xbf, 0x0f, 0x8d, 0x2c, 0x7c, 0x83, 0xab, 0xff, 0x06, 0xb6, 0xcf, 0x28, + 0x11, 0x42, 0xd2, 0xc4, 0x9b, 0x1e, 0x8e, 0x0e, 0x51, 0xd2, 0xed, 0xf1, 0x57, 0xf1, 0x0d, 0x46, + 0x9a, 0xfd, 0x5b, 0xd8, 0x99, 0x2f, 0x7e, 0x03, 0xf3, 0x1b, 0xd0, 0x54, 0x82, 0x88, 0x69, 0x3d, + 0xbe, 0xd1, 0xdf, 0xd3, 0x47, 0x3a, 0x01, 0x7f, 0xca, 0x41, 0xf5, 0x1c, 0x67, 0xeb, 0xfe, 0xb6, + 0x97, 0x36, 0xe3, 0x06, 0xf2, 0xb3, 0x2a, 0xfa, 0x31, 0xd4, 0xe4, 0x0a, 0xef, 0x32, 0x31, 0x98, + 0x5d, 0x26, 0x7c, 0xd2, 0x9b, 0xfb, 0xaa, 0x3c, 0x18, 0x0f, 0x6c, 0xf9, 0x8e, 0xe0, 0x89, 0xce, + 0xb3, 0x9f, 0x8f, 0x03, 0x71, 0xb0, 0x54, 0x32, 0x1e, 0xd5, 0xb7, 0xf3, 0x59, 0x7c, 0x92, 0xcd, + 0x50, 0xa5, 0xed, 0x3c, 0x02, 0x5b, 0x3c, 0x7e, 0xc6, 0xc4, 0x38, 0x88, 0x7c, 0x31, 0x68, 0x33, + 0xcb, 0xc3, 0x6b, 0x78, 0xf8, 0x4e, 0xae, 0xbb, 0x2e, 0x13, 0x6b, 0x50, 0x37, 0x2b, 0xc1, 0xa8, + 0xc9, 0x2c, 0x7c, 0x83, 0xa2, 0x38, 0x87, 0xf2, 0x13, 0xe4, 0x5d, 0x26, 0xa3, 0x0a, 0xdc, 0x81, + 0xa2, 0x47, 0x22, 0x2f, 0xa1, 0x14, 0x47, 0xde, 0x50, 0x0f, 0x1e, 0x13, 0x12, 0x1c, 0xf2, 0x2b, + 0x4a, 0xa5, 0x5e, 0x7f, 0x7a, 0x99, 0x90, 0xfd, 0x25, 0x54, 0x52, 0xa5, 0xda, 0x85, 0x47, 0xb0, + 0x88, 0x07, 0xe3, 0xd4, 0x57, 0xda, 0xe9, 0x7f, 0x08, 0x8e, 0x05, 0xea, 0xa8, 0x43, 0xfd, 0xcc, + 0x70, 0x42, 0xf1, 0x09, 0x25, 0xfd, 0x8c, 0x5f, 0xf6, 0x01, 0x6c, 0xcc, 0x38, 0xbb, 0x8d, 0xfa, + 0x27, 0x9f, 0xfe, 0xd4, 0x1e, 0x04, 0x1c, 0x33, 0xd6, 0x0e, 0xc8, 0x9e, 0xfa, 0xb5, 0xd7, 0x25, + 0x7b, 0x03, 0xbe, 0x27, 0xff, 0x4f, 0xb1, 0x37, 0xf5, 0xf9, 0xd3, 0x59, 0x92, 0x07, 0x9f, 0xff, + 0x27, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x08, 0xf6, 0x71, 0x31, 0x19, 0x00, 0x00, } diff --git a/go/vt/proto/vtgate/vtgate.pb.go b/go/vt/proto/vtgate/vtgate.pb.go index ae204d1e8ac..e57b87e3dc0 100644 --- a/go/vt/proto/vtgate/vtgate.pb.go +++ b/go/vt/proto/vtgate/vtgate.pb.go @@ -53,7 +53,7 @@ func (x TransactionMode) String() string { return proto.EnumName(TransactionMode_name, int32(x)) } func (TransactionMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{0} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{0} } // Session objects are exchanged like cookies through various @@ -98,7 +98,7 @@ func (m *Session) Reset() { *m = Session{} } func (m *Session) String() string { return proto.CompactTextString(m) } func (*Session) ProtoMessage() {} func (*Session) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{0} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{0} } func (m *Session) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Session.Unmarshal(m, b) @@ -186,7 +186,7 @@ func (m *Session_ShardSession) Reset() { *m = Session_ShardSession{} } func (m *Session_ShardSession) String() string { return proto.CompactTextString(m) } func (*Session_ShardSession) ProtoMessage() {} func (*Session_ShardSession) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{0, 0} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{0, 0} } func (m *Session_ShardSession) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Session_ShardSession.Unmarshal(m, b) @@ -244,7 +244,7 @@ func (m *ExecuteRequest) Reset() { *m = ExecuteRequest{} } func (m *ExecuteRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteRequest) ProtoMessage() {} func (*ExecuteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{1} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{1} } func (m *ExecuteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteRequest.Unmarshal(m, b) @@ -332,7 +332,7 @@ func (m *ExecuteResponse) Reset() { *m = ExecuteResponse{} } func (m *ExecuteResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteResponse) ProtoMessage() {} func (*ExecuteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{2} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{2} } func (m *ExecuteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteResponse.Unmarshal(m, b) @@ -402,7 +402,7 @@ func (m *ExecuteShardsRequest) Reset() { *m = ExecuteShardsRequest{} } func (m *ExecuteShardsRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteShardsRequest) ProtoMessage() {} func (*ExecuteShardsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{3} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{3} } func (m *ExecuteShardsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteShardsRequest.Unmarshal(m, b) @@ -497,7 +497,7 @@ func (m *ExecuteShardsResponse) Reset() { *m = ExecuteShardsResponse{} } func (m *ExecuteShardsResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteShardsResponse) ProtoMessage() {} func (*ExecuteShardsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{4} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{4} } func (m *ExecuteShardsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteShardsResponse.Unmarshal(m, b) @@ -568,7 +568,7 @@ func (m *ExecuteKeyspaceIdsRequest) Reset() { *m = ExecuteKeyspaceIdsReq func (m *ExecuteKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteKeyspaceIdsRequest) ProtoMessage() {} func (*ExecuteKeyspaceIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{5} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{5} } func (m *ExecuteKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteKeyspaceIdsRequest.Unmarshal(m, b) @@ -663,7 +663,7 @@ func (m *ExecuteKeyspaceIdsResponse) Reset() { *m = ExecuteKeyspaceIdsRe func (m *ExecuteKeyspaceIdsResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteKeyspaceIdsResponse) ProtoMessage() {} func (*ExecuteKeyspaceIdsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{6} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{6} } func (m *ExecuteKeyspaceIdsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteKeyspaceIdsResponse.Unmarshal(m, b) @@ -734,7 +734,7 @@ func (m *ExecuteKeyRangesRequest) Reset() { *m = ExecuteKeyRangesRequest func (m *ExecuteKeyRangesRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteKeyRangesRequest) ProtoMessage() {} func (*ExecuteKeyRangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{7} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{7} } func (m *ExecuteKeyRangesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteKeyRangesRequest.Unmarshal(m, b) @@ -829,7 +829,7 @@ func (m *ExecuteKeyRangesResponse) Reset() { *m = ExecuteKeyRangesRespon func (m *ExecuteKeyRangesResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteKeyRangesResponse) ProtoMessage() {} func (*ExecuteKeyRangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{8} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{8} } func (m *ExecuteKeyRangesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteKeyRangesResponse.Unmarshal(m, b) @@ -902,7 +902,7 @@ func (m *ExecuteEntityIdsRequest) Reset() { *m = ExecuteEntityIdsRequest func (m *ExecuteEntityIdsRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteEntityIdsRequest) ProtoMessage() {} func (*ExecuteEntityIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{9} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{9} } func (m *ExecuteEntityIdsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteEntityIdsRequest.Unmarshal(m, b) @@ -1001,7 +1001,7 @@ func (m *ExecuteEntityIdsRequest_EntityId) Reset() { *m = ExecuteEntityI func (m *ExecuteEntityIdsRequest_EntityId) String() string { return proto.CompactTextString(m) } func (*ExecuteEntityIdsRequest_EntityId) ProtoMessage() {} func (*ExecuteEntityIdsRequest_EntityId) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{9, 0} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{9, 0} } func (m *ExecuteEntityIdsRequest_EntityId) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteEntityIdsRequest_EntityId.Unmarshal(m, b) @@ -1061,7 +1061,7 @@ func (m *ExecuteEntityIdsResponse) Reset() { *m = ExecuteEntityIdsRespon func (m *ExecuteEntityIdsResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteEntityIdsResponse) ProtoMessage() {} func (*ExecuteEntityIdsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{10} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{10} } func (m *ExecuteEntityIdsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteEntityIdsResponse.Unmarshal(m, b) @@ -1126,7 +1126,7 @@ func (m *ExecuteBatchRequest) Reset() { *m = ExecuteBatchRequest{} } func (m *ExecuteBatchRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteBatchRequest) ProtoMessage() {} func (*ExecuteBatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{11} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{11} } func (m *ExecuteBatchRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteBatchRequest.Unmarshal(m, b) @@ -1214,7 +1214,7 @@ func (m *ExecuteBatchResponse) Reset() { *m = ExecuteBatchResponse{} } func (m *ExecuteBatchResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteBatchResponse) ProtoMessage() {} func (*ExecuteBatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{12} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{12} } func (m *ExecuteBatchResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteBatchResponse.Unmarshal(m, b) @@ -1274,7 +1274,7 @@ func (m *BoundShardQuery) Reset() { *m = BoundShardQuery{} } func (m *BoundShardQuery) String() string { return proto.CompactTextString(m) } func (*BoundShardQuery) ProtoMessage() {} func (*BoundShardQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{13} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{13} } func (m *BoundShardQuery) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BoundShardQuery.Unmarshal(m, b) @@ -1342,7 +1342,7 @@ func (m *ExecuteBatchShardsRequest) Reset() { *m = ExecuteBatchShardsReq func (m *ExecuteBatchShardsRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteBatchShardsRequest) ProtoMessage() {} func (*ExecuteBatchShardsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{14} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{14} } func (m *ExecuteBatchShardsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteBatchShardsRequest.Unmarshal(m, b) @@ -1423,7 +1423,7 @@ func (m *ExecuteBatchShardsResponse) Reset() { *m = ExecuteBatchShardsRe func (m *ExecuteBatchShardsResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteBatchShardsResponse) ProtoMessage() {} func (*ExecuteBatchShardsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{15} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{15} } func (m *ExecuteBatchShardsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteBatchShardsResponse.Unmarshal(m, b) @@ -1484,7 +1484,7 @@ func (m *BoundKeyspaceIdQuery) Reset() { *m = BoundKeyspaceIdQuery{} } func (m *BoundKeyspaceIdQuery) String() string { return proto.CompactTextString(m) } func (*BoundKeyspaceIdQuery) ProtoMessage() {} func (*BoundKeyspaceIdQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{16} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{16} } func (m *BoundKeyspaceIdQuery) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BoundKeyspaceIdQuery.Unmarshal(m, b) @@ -1551,7 +1551,7 @@ func (m *ExecuteBatchKeyspaceIdsRequest) Reset() { *m = ExecuteBatchKeys func (m *ExecuteBatchKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) } func (*ExecuteBatchKeyspaceIdsRequest) ProtoMessage() {} func (*ExecuteBatchKeyspaceIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{17} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{17} } func (m *ExecuteBatchKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteBatchKeyspaceIdsRequest.Unmarshal(m, b) @@ -1632,7 +1632,7 @@ func (m *ExecuteBatchKeyspaceIdsResponse) Reset() { *m = ExecuteBatchKey func (m *ExecuteBatchKeyspaceIdsResponse) String() string { return proto.CompactTextString(m) } func (*ExecuteBatchKeyspaceIdsResponse) ProtoMessage() {} func (*ExecuteBatchKeyspaceIdsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{18} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{18} } func (m *ExecuteBatchKeyspaceIdsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecuteBatchKeyspaceIdsResponse.Unmarshal(m, b) @@ -1696,7 +1696,7 @@ func (m *StreamExecuteRequest) Reset() { *m = StreamExecuteRequest{} } func (m *StreamExecuteRequest) String() string { return proto.CompactTextString(m) } func (*StreamExecuteRequest) ProtoMessage() {} func (*StreamExecuteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{19} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{19} } func (m *StreamExecuteRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteRequest.Unmarshal(m, b) @@ -1775,7 +1775,7 @@ func (m *StreamExecuteResponse) Reset() { *m = StreamExecuteResponse{} } func (m *StreamExecuteResponse) String() string { return proto.CompactTextString(m) } func (*StreamExecuteResponse) ProtoMessage() {} func (*StreamExecuteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{20} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{20} } func (m *StreamExecuteResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteResponse.Unmarshal(m, b) @@ -1826,7 +1826,7 @@ func (m *StreamExecuteShardsRequest) Reset() { *m = StreamExecuteShardsR func (m *StreamExecuteShardsRequest) String() string { return proto.CompactTextString(m) } func (*StreamExecuteShardsRequest) ProtoMessage() {} func (*StreamExecuteShardsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{21} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{21} } func (m *StreamExecuteShardsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteShardsRequest.Unmarshal(m, b) @@ -1903,7 +1903,7 @@ func (m *StreamExecuteShardsResponse) Reset() { *m = StreamExecuteShards func (m *StreamExecuteShardsResponse) String() string { return proto.CompactTextString(m) } func (*StreamExecuteShardsResponse) ProtoMessage() {} func (*StreamExecuteShardsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{22} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{22} } func (m *StreamExecuteShardsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteShardsResponse.Unmarshal(m, b) @@ -1955,7 +1955,7 @@ func (m *StreamExecuteKeyspaceIdsRequest) Reset() { *m = StreamExecuteKe func (m *StreamExecuteKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) } func (*StreamExecuteKeyspaceIdsRequest) ProtoMessage() {} func (*StreamExecuteKeyspaceIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{23} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{23} } func (m *StreamExecuteKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteKeyspaceIdsRequest.Unmarshal(m, b) @@ -2032,7 +2032,7 @@ func (m *StreamExecuteKeyspaceIdsResponse) Reset() { *m = StreamExecuteK func (m *StreamExecuteKeyspaceIdsResponse) String() string { return proto.CompactTextString(m) } func (*StreamExecuteKeyspaceIdsResponse) ProtoMessage() {} func (*StreamExecuteKeyspaceIdsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{24} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{24} } func (m *StreamExecuteKeyspaceIdsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteKeyspaceIdsResponse.Unmarshal(m, b) @@ -2084,7 +2084,7 @@ func (m *StreamExecuteKeyRangesRequest) Reset() { *m = StreamExecuteKeyR func (m *StreamExecuteKeyRangesRequest) String() string { return proto.CompactTextString(m) } func (*StreamExecuteKeyRangesRequest) ProtoMessage() {} func (*StreamExecuteKeyRangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{25} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{25} } func (m *StreamExecuteKeyRangesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteKeyRangesRequest.Unmarshal(m, b) @@ -2161,7 +2161,7 @@ func (m *StreamExecuteKeyRangesResponse) Reset() { *m = StreamExecuteKey func (m *StreamExecuteKeyRangesResponse) String() string { return proto.CompactTextString(m) } func (*StreamExecuteKeyRangesResponse) ProtoMessage() {} func (*StreamExecuteKeyRangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{26} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{26} } func (m *StreamExecuteKeyRangesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StreamExecuteKeyRangesResponse.Unmarshal(m, b) @@ -2207,7 +2207,7 @@ func (m *BeginRequest) Reset() { *m = BeginRequest{} } func (m *BeginRequest) String() string { return proto.CompactTextString(m) } func (*BeginRequest) ProtoMessage() {} func (*BeginRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{27} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{27} } func (m *BeginRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BeginRequest.Unmarshal(m, b) @@ -2254,7 +2254,7 @@ func (m *BeginResponse) Reset() { *m = BeginResponse{} } func (m *BeginResponse) String() string { return proto.CompactTextString(m) } func (*BeginResponse) ProtoMessage() {} func (*BeginResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{28} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{28} } func (m *BeginResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BeginResponse.Unmarshal(m, b) @@ -2302,7 +2302,7 @@ func (m *CommitRequest) Reset() { *m = CommitRequest{} } func (m *CommitRequest) String() string { return proto.CompactTextString(m) } func (*CommitRequest) ProtoMessage() {} func (*CommitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{29} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{29} } func (m *CommitRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CommitRequest.Unmarshal(m, b) @@ -2354,7 +2354,7 @@ func (m *CommitResponse) Reset() { *m = CommitResponse{} } func (m *CommitResponse) String() string { return proto.CompactTextString(m) } func (*CommitResponse) ProtoMessage() {} func (*CommitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{30} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{30} } func (m *CommitResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CommitResponse.Unmarshal(m, b) @@ -2390,7 +2390,7 @@ func (m *RollbackRequest) Reset() { *m = RollbackRequest{} } func (m *RollbackRequest) String() string { return proto.CompactTextString(m) } func (*RollbackRequest) ProtoMessage() {} func (*RollbackRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{31} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{31} } func (m *RollbackRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RollbackRequest.Unmarshal(m, b) @@ -2435,7 +2435,7 @@ func (m *RollbackResponse) Reset() { *m = RollbackResponse{} } func (m *RollbackResponse) String() string { return proto.CompactTextString(m) } func (*RollbackResponse) ProtoMessage() {} func (*RollbackResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{32} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{32} } func (m *RollbackResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RollbackResponse.Unmarshal(m, b) @@ -2471,7 +2471,7 @@ func (m *ResolveTransactionRequest) Reset() { *m = ResolveTransactionReq func (m *ResolveTransactionRequest) String() string { return proto.CompactTextString(m) } func (*ResolveTransactionRequest) ProtoMessage() {} func (*ResolveTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{33} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{33} } func (m *ResolveTransactionRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResolveTransactionRequest.Unmarshal(m, b) @@ -2527,7 +2527,7 @@ func (m *MessageStreamRequest) Reset() { *m = MessageStreamRequest{} } func (m *MessageStreamRequest) String() string { return proto.CompactTextString(m) } func (*MessageStreamRequest) ProtoMessage() {} func (*MessageStreamRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{34} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{34} } func (m *MessageStreamRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MessageStreamRequest.Unmarshal(m, b) @@ -2602,7 +2602,7 @@ func (m *MessageAckRequest) Reset() { *m = MessageAckRequest{} } func (m *MessageAckRequest) String() string { return proto.CompactTextString(m) } func (*MessageAckRequest) ProtoMessage() {} func (*MessageAckRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{35} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{35} } func (m *MessageAckRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MessageAckRequest.Unmarshal(m, b) @@ -2666,7 +2666,7 @@ func (m *IdKeyspaceId) Reset() { *m = IdKeyspaceId{} } func (m *IdKeyspaceId) String() string { return proto.CompactTextString(m) } func (*IdKeyspaceId) ProtoMessage() {} func (*IdKeyspaceId) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{36} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{36} } func (m *IdKeyspaceId) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_IdKeyspaceId.Unmarshal(m, b) @@ -2719,7 +2719,7 @@ func (m *MessageAckKeyspaceIdsRequest) Reset() { *m = MessageAckKeyspace func (m *MessageAckKeyspaceIdsRequest) String() string { return proto.CompactTextString(m) } func (*MessageAckKeyspaceIdsRequest) ProtoMessage() {} func (*MessageAckKeyspaceIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{37} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{37} } func (m *MessageAckKeyspaceIdsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MessageAckKeyspaceIdsRequest.Unmarshal(m, b) @@ -2778,7 +2778,7 @@ func (m *ResolveTransactionResponse) Reset() { *m = ResolveTransactionRe func (m *ResolveTransactionResponse) String() string { return proto.CompactTextString(m) } func (*ResolveTransactionResponse) ProtoMessage() {} func (*ResolveTransactionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{38} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{38} } func (m *ResolveTransactionResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResolveTransactionResponse.Unmarshal(m, b) @@ -2896,7 +2896,7 @@ func (m *SplitQueryRequest) Reset() { *m = SplitQueryRequest{} } func (m *SplitQueryRequest) String() string { return proto.CompactTextString(m) } func (*SplitQueryRequest) ProtoMessage() {} func (*SplitQueryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{39} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{39} } func (m *SplitQueryRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SplitQueryRequest.Unmarshal(m, b) @@ -2985,7 +2985,7 @@ func (m *SplitQueryResponse) Reset() { *m = SplitQueryResponse{} } func (m *SplitQueryResponse) String() string { return proto.CompactTextString(m) } func (*SplitQueryResponse) ProtoMessage() {} func (*SplitQueryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{40} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{40} } func (m *SplitQueryResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SplitQueryResponse.Unmarshal(m, b) @@ -3026,7 +3026,7 @@ func (m *SplitQueryResponse_KeyRangePart) Reset() { *m = SplitQueryRespo func (m *SplitQueryResponse_KeyRangePart) String() string { return proto.CompactTextString(m) } func (*SplitQueryResponse_KeyRangePart) ProtoMessage() {} func (*SplitQueryResponse_KeyRangePart) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{40, 0} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{40, 0} } func (m *SplitQueryResponse_KeyRangePart) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SplitQueryResponse_KeyRangePart.Unmarshal(m, b) @@ -3074,7 +3074,7 @@ func (m *SplitQueryResponse_ShardPart) Reset() { *m = SplitQueryResponse func (m *SplitQueryResponse_ShardPart) String() string { return proto.CompactTextString(m) } func (*SplitQueryResponse_ShardPart) ProtoMessage() {} func (*SplitQueryResponse_ShardPart) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{40, 1} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{40, 1} } func (m *SplitQueryResponse_ShardPart) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SplitQueryResponse_ShardPart.Unmarshal(m, b) @@ -3127,7 +3127,7 @@ func (m *SplitQueryResponse_Part) Reset() { *m = SplitQueryResponse_Part func (m *SplitQueryResponse_Part) String() string { return proto.CompactTextString(m) } func (*SplitQueryResponse_Part) ProtoMessage() {} func (*SplitQueryResponse_Part) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{40, 2} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{40, 2} } func (m *SplitQueryResponse_Part) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SplitQueryResponse_Part.Unmarshal(m, b) @@ -3188,7 +3188,7 @@ func (m *GetSrvKeyspaceRequest) Reset() { *m = GetSrvKeyspaceRequest{} } func (m *GetSrvKeyspaceRequest) String() string { return proto.CompactTextString(m) } func (*GetSrvKeyspaceRequest) ProtoMessage() {} func (*GetSrvKeyspaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{41} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{41} } func (m *GetSrvKeyspaceRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSrvKeyspaceRequest.Unmarshal(m, b) @@ -3228,7 +3228,7 @@ func (m *GetSrvKeyspaceResponse) Reset() { *m = GetSrvKeyspaceResponse{} func (m *GetSrvKeyspaceResponse) String() string { return proto.CompactTextString(m) } func (*GetSrvKeyspaceResponse) ProtoMessage() {} func (*GetSrvKeyspaceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{42} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{42} } func (m *GetSrvKeyspaceResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetSrvKeyspaceResponse.Unmarshal(m, b) @@ -3286,7 +3286,7 @@ func (m *UpdateStreamRequest) Reset() { *m = UpdateStreamRequest{} } func (m *UpdateStreamRequest) String() string { return proto.CompactTextString(m) } func (*UpdateStreamRequest) ProtoMessage() {} func (*UpdateStreamRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{43} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{43} } func (m *UpdateStreamRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateStreamRequest.Unmarshal(m, b) @@ -3374,7 +3374,7 @@ func (m *UpdateStreamResponse) Reset() { *m = UpdateStreamResponse{} } func (m *UpdateStreamResponse) String() string { return proto.CompactTextString(m) } func (*UpdateStreamResponse) ProtoMessage() {} func (*UpdateStreamResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_vtgate_8f5c6038eac4796e, []int{44} + return fileDescriptor_vtgate_1d4a858d9b127f46, []int{44} } func (m *UpdateStreamResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateStreamResponse.Unmarshal(m, b) @@ -3462,9 +3462,9 @@ func init() { proto.RegisterEnum("vtgate.TransactionMode", TransactionMode_name, TransactionMode_value) } -func init() { proto.RegisterFile("vtgate.proto", fileDescriptor_vtgate_8f5c6038eac4796e) } +func init() { proto.RegisterFile("vtgate.proto", fileDescriptor_vtgate_1d4a858d9b127f46) } -var fileDescriptor_vtgate_8f5c6038eac4796e = []byte{ +var fileDescriptor_vtgate_1d4a858d9b127f46 = []byte{ // 1883 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0x4f, 0x8f, 0x23, 0x47, 0x15, 0xa7, 0xbb, 0xfd, 0xf7, 0xf9, 0xef, 0xd6, 0x78, 0x77, 0x1d, 0x67, 0xd8, 0x99, 0x74, 0x18, diff --git a/go/vt/schemamanager/schemaswap/schema_swap.go b/go/vt/schemamanager/schemaswap/schema_swap.go index 2e8e232b54f..07dd07c4221 100644 --- a/go/vt/schemamanager/schemaswap/schema_swap.go +++ b/go/vt/schemamanager/schemaswap/schema_swap.go @@ -1092,7 +1092,8 @@ func (shardSwap *shardSchemaSwap) takeSeedBackup() (err error) { } shardSwap.addShardLog(fmt.Sprintf("Taking backup on the seed tablet %v", seedTablet.Alias)) - eventStream, err := shardSwap.parent.tabletClient.Backup(shardSwap.parent.ctx, seedTablet, *backupConcurrency) + // FIXME: should master be allowed for backup here? + eventStream, err := shardSwap.parent.tabletClient.Backup(shardSwap.parent.ctx, seedTablet, *backupConcurrency, false) if err != nil { return err } diff --git a/go/vt/vtcombo/tablet_map.go b/go/vt/vtcombo/tablet_map.go index 6e3abbddec3..92717e492f5 100644 --- a/go/vt/vtcombo/tablet_map.go +++ b/go/vt/vtcombo/tablet_map.go @@ -695,7 +695,7 @@ func (itmc *internalTabletManagerClient) PromoteSlave(ctx context.Context, table return "", fmt.Errorf("not implemented in vtcombo") } -func (itmc *internalTabletManagerClient) Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int) (logutil.EventStream, error) { +func (itmc *internalTabletManagerClient) Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int, allowMaster bool) (logutil.EventStream, error) { return nil, fmt.Errorf("not implemented in vtcombo") } diff --git a/go/vt/vtctl/backup.go b/go/vt/vtctl/backup.go index 487bc909183..e22917bbfcb 100644 --- a/go/vt/vtctl/backup.go +++ b/go/vt/vtctl/backup.go @@ -39,7 +39,7 @@ func init() { addCommand("Shards", command{ "BackupShard", commandBackupShard, - "", + "[-allow_master=false] ", "Chooses a tablet and creates a backup for a shard."}) addCommand("Shards", command{ "RemoveBackup", @@ -50,7 +50,7 @@ func init() { addCommand("Tablets", command{ "Backup", commandBackup, - "[-concurrency=4] ", + "[-concurrency=4] [-allow_master=false] ", "Stops mysqld and uses the BackupStorage service to store a new backup. This function also remembers if the tablet was replicating so that it can restore the same state after the backup completes."}) addCommand("Tablets", command{ "RestoreFromBackup", @@ -61,6 +61,8 @@ func init() { func commandBackup(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { concurrency := subFlags.Int("concurrency", 4, "Specifies the number of compression/checksum jobs to run simultaneously") + allowMaster := subFlags.Bool("allow_master", false, "Allows backups to be taken on master. Warning!! If you are using the builtin backup engine, this will shutdown your master mysql for as long as it takes to create a backup ") + if err := subFlags.Parse(args); err != nil { return err } @@ -77,11 +79,13 @@ func commandBackup(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.Fl return err } - return execBackup(ctx, wr, tabletInfo.Tablet, *concurrency) + return execBackup(ctx, wr, tabletInfo.Tablet, *concurrency, *allowMaster) } func commandBackupShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error { concurrency := subFlags.Int("concurrency", 4, "Specifies the number of compression/checksum jobs to run simultaneously") + allowMaster := subFlags.Bool("allow_master", false, "Whether to use master tablet for backup. Warning!! If you are using the builtin backup engine, this will shutdown your master mysql for as long as it takes to create a backup ") + if err := subFlags.Parse(args); err != nil { return err } @@ -103,13 +107,12 @@ func commandBackupShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *fl var secondsBehind uint32 for i := range tablets { - // only run a backup on a replica, rdonly or spare tablet type + // find a replica, rdonly or spare tablet type to run the backup on switch tablets[i].Type { case topodatapb.TabletType_REPLICA, topodatapb.TabletType_RDONLY, topodatapb.TabletType_SPARE: default: continue } - // choose the first tablet as the baseline if tabletForBackup == nil { tabletForBackup = tablets[i].Tablet @@ -124,16 +127,29 @@ func commandBackupShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *fl } } + if tabletForBackup == nil && *allowMaster { + for i := range tablets { + switch tablets[i].Type { + case topodatapb.TabletType_MASTER: + tabletForBackup = tablets[i].Tablet + secondsBehind = 0 + break + default: + continue + } + } + } + if tabletForBackup == nil { return errors.New("no tablet available for backup") } - return execBackup(ctx, wr, tabletForBackup, *concurrency) + return execBackup(ctx, wr, tabletForBackup, *concurrency, *allowMaster) } // execBackup is shared by Backup and BackupShard -func execBackup(ctx context.Context, wr *wrangler.Wrangler, tablet *topodatapb.Tablet, concurrency int) error { - stream, err := wr.TabletManagerClient().Backup(ctx, tablet, concurrency) +func execBackup(ctx context.Context, wr *wrangler.Wrangler, tablet *topodatapb.Tablet, concurrency int, allowMaster bool) error { + stream, err := wr.TabletManagerClient().Backup(ctx, tablet, concurrency, allowMaster) if err != nil { return err } diff --git a/go/vt/vttablet/agentrpctest/test_agent_rpc.go b/go/vt/vttablet/agentrpctest/test_agent_rpc.go index 7039a216a46..321cce76891 100644 --- a/go/vt/vttablet/agentrpctest/test_agent_rpc.go +++ b/go/vt/vttablet/agentrpctest/test_agent_rpc.go @@ -1136,10 +1136,11 @@ func agentRPCTestPromoteSlavePanic(ctx context.Context, t *testing.T, client tmc // var testBackupConcurrency = 24 +var testBackupAllowMaster = false var testBackupCalled = false var testRestoreFromBackupCalled = false -func (fra *fakeRPCAgent) Backup(ctx context.Context, concurrency int, logger logutil.Logger) error { +func (fra *fakeRPCAgent) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { if fra.panics { panic(fmt.Errorf("test-triggered panic")) } @@ -1150,7 +1151,7 @@ func (fra *fakeRPCAgent) Backup(ctx context.Context, concurrency int, logger log } func agentRPCTestBackup(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { - stream, err := client.Backup(ctx, tablet, testBackupConcurrency) + stream, err := client.Backup(ctx, tablet, testBackupConcurrency, testBackupAllowMaster) if err != nil { t.Fatalf("Backup failed: %v", err) } @@ -1159,7 +1160,7 @@ func agentRPCTestBackup(ctx context.Context, t *testing.T, client tmclient.Table } func agentRPCTestBackupPanic(ctx context.Context, t *testing.T, client tmclient.TabletManagerClient, tablet *topodatapb.Tablet) { - stream, err := client.Backup(ctx, tablet, testBackupConcurrency) + stream, err := client.Backup(ctx, tablet, testBackupConcurrency, testBackupAllowMaster) if err != nil { t.Fatalf("Backup failed: %v", err) } diff --git a/go/vt/vttablet/faketmclient/fake_client.go b/go/vt/vttablet/faketmclient/fake_client.go index 5ce41a95adf..faa37d809a8 100644 --- a/go/vt/vttablet/faketmclient/fake_client.go +++ b/go/vt/vttablet/faketmclient/fake_client.go @@ -296,7 +296,7 @@ func (e *eofEventStream) Recv() (*logutilpb.Event, error) { } // Backup is part of the tmclient.TabletManagerClient interface. -func (client *FakeTabletManagerClient) Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int) (logutil.EventStream, error) { +func (client *FakeTabletManagerClient) Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int, allowMaster bool) (logutil.EventStream, error) { return &eofEventStream{}, nil } diff --git a/go/vt/vttablet/grpctmclient/client.go b/go/vt/vttablet/grpctmclient/client.go index 7b83101e1be..c8c8b6261c8 100644 --- a/go/vt/vttablet/grpctmclient/client.go +++ b/go/vt/vttablet/grpctmclient/client.go @@ -764,7 +764,7 @@ func (e *backupStreamAdapter) Recv() (*logutilpb.Event, error) { } // Backup is part of the tmclient.TabletManagerClient interface. -func (client *Client) Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int) (logutil.EventStream, error) { +func (client *Client) Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int, allowMaster bool) (logutil.EventStream, error) { cc, c, err := client.dial(tablet) if err != nil { return nil, err @@ -772,6 +772,7 @@ func (client *Client) Backup(ctx context.Context, tablet *topodatapb.Tablet, con stream, err := c.Backup(ctx, &tabletmanagerdatapb.BackupRequest{ Concurrency: int64(concurrency), + AllowMaster: bool(allowMaster), }) if err != nil { cc.Close() diff --git a/go/vt/vttablet/grpctmserver/server.go b/go/vt/vttablet/grpctmserver/server.go index bba4157a885..cc6b25eb3ce 100644 --- a/go/vt/vttablet/grpctmserver/server.go +++ b/go/vt/vttablet/grpctmserver/server.go @@ -441,7 +441,7 @@ func (s *server) Backup(request *tabletmanagerdatapb.BackupRequest, stream table }) }) - return s.agent.Backup(ctx, int(request.Concurrency), logger) + return s.agent.Backup(ctx, int(request.Concurrency), logger, bool(request.AllowMaster)) } func (s *server) RestoreFromBackup(request *tabletmanagerdatapb.RestoreFromBackupRequest, stream tabletmanagerservicepb.TabletManager_RestoreFromBackupServer) (err error) { diff --git a/go/vt/vttablet/tabletmanager/rpc_agent.go b/go/vt/vttablet/tabletmanager/rpc_agent.go index 1bef381a7e8..0538fea66c1 100644 --- a/go/vt/vttablet/tabletmanager/rpc_agent.go +++ b/go/vt/vttablet/tabletmanager/rpc_agent.go @@ -124,7 +124,7 @@ type RPCAgent interface { // Backup / restore related methods - Backup(ctx context.Context, concurrency int, logger logutil.Logger) error + Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error RestoreFromBackup(ctx context.Context, logger logutil.Logger) error diff --git a/go/vt/vttablet/tabletmanager/rpc_backup.go b/go/vt/vttablet/tabletmanager/rpc_backup.go index 8eeeb322ce1..bd52eeedaeb 100644 --- a/go/vt/vttablet/tabletmanager/rpc_backup.go +++ b/go/vt/vttablet/tabletmanager/rpc_backup.go @@ -30,7 +30,7 @@ import ( ) // Backup takes a db backup and sends it to the BackupStorage -func (agent *ActionAgent) Backup(ctx context.Context, concurrency int, logger logutil.Logger) error { +func (agent *ActionAgent) Backup(ctx context.Context, concurrency int, logger logutil.Logger, allowMaster bool) error { if err := agent.lock(ctx); err != nil { return err } @@ -45,16 +45,16 @@ func (agent *ActionAgent) Backup(ctx context.Context, concurrency int, logger lo // but the process didn't find out about this. // It is not safe to take backups from tablet in this state currentTablet := agent.Tablet() - if currentTablet.Type == topodatapb.TabletType_MASTER { - return fmt.Errorf("type MASTER cannot take backup, if you really need to do this, restart vttablet in replica mode") + if !allowMaster && currentTablet.Type == topodatapb.TabletType_MASTER { + return fmt.Errorf("type MASTER cannot take backup, if you really need to do this, rerun the backup command with -allow_master") } tablet, err := agent.TopoServer.GetTablet(ctx, agent.TabletAlias) if err != nil { return err } - if tablet.Type == topodatapb.TabletType_MASTER { - return fmt.Errorf("type MASTER cannot take backup, if you really need to do this, restart vttablet in replica mode") + if !allowMaster && tablet.Type == topodatapb.TabletType_MASTER { + return fmt.Errorf("type MASTER cannot take backup, if you really need to do this, rerun the backup command with -allow_master") } originalType := tablet.Type diff --git a/go/vt/vttablet/tmclient/rpc_client_api.go b/go/vt/vttablet/tmclient/rpc_client_api.go index 77c344d35d4..b5afc287789 100644 --- a/go/vt/vttablet/tmclient/rpc_client_api.go +++ b/go/vt/vttablet/tmclient/rpc_client_api.go @@ -197,7 +197,7 @@ type TabletManagerClient interface { // // Backup creates a database backup - Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int) (logutil.EventStream, error) + Backup(ctx context.Context, tablet *topodatapb.Tablet, concurrency int, allowMaster bool) (logutil.EventStream, error) // RestoreFromBackup deletes local data and restores database from backup RestoreFromBackup(ctx context.Context, tablet *topodatapb.Tablet) (logutil.EventStream, error) diff --git a/proto/tabletmanagerdata.proto b/proto/tabletmanagerdata.proto index 7606d568405..46818dd1623 100644 --- a/proto/tabletmanagerdata.proto +++ b/proto/tabletmanagerdata.proto @@ -427,6 +427,7 @@ message PromoteSlaveResponse { message BackupRequest { int64 concurrency = 1; + bool allowMaster = 2; } message BackupResponse { diff --git a/py/vtproto/tabletmanagerdata_pb2.py b/py/vtproto/tabletmanagerdata_pb2.py index 62f4a97b3b1..7cf1782ef24 100644 --- a/py/vtproto/tabletmanagerdata_pb2.py +++ b/py/vtproto/tabletmanagerdata_pb2.py @@ -7,7 +7,6 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database -from google.protobuf import descriptor_pb2 # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -23,7 +22,8 @@ name='tabletmanagerdata.proto', package='tabletmanagerdata', syntax='proto3', - serialized_pb=_b('\n\x17tabletmanagerdata.proto\x12\x11tabletmanagerdata\x1a\x0bquery.proto\x1a\x0etopodata.proto\x1a\x15replicationdata.proto\x1a\rlogutil.proto\"\x93\x01\n\x0fTableDefinition\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x0f\n\x07\x63olumns\x18\x03 \x03(\t\x12\x1b\n\x13primary_key_columns\x18\x04 \x03(\t\x12\x0c\n\x04type\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x61ta_length\x18\x06 \x01(\x04\x12\x11\n\trow_count\x18\x07 \x01(\x04\"{\n\x10SchemaDefinition\x12\x17\n\x0f\x64\x61tabase_schema\x18\x01 \x01(\t\x12=\n\x11table_definitions\x18\x02 \x03(\x0b\x32\".tabletmanagerdata.TableDefinition\x12\x0f\n\x07version\x18\x03 \x01(\t\"\x8b\x01\n\x12SchemaChangeResult\x12:\n\rbefore_schema\x18\x01 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\x12\x39\n\x0c\x61\x66ter_schema\x18\x02 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\xc1\x01\n\x0eUserPermission\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04user\x18\x02 \x01(\t\x12\x19\n\x11password_checksum\x18\x03 \x01(\x04\x12\x45\n\nprivileges\x18\x04 \x03(\x0b\x32\x31.tabletmanagerdata.UserPermission.PrivilegesEntry\x1a\x31\n\x0fPrivilegesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xae\x01\n\x0c\x44\x62Permission\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\n\n\x02\x64\x62\x18\x02 \x01(\t\x12\x0c\n\x04user\x18\x03 \x01(\t\x12\x43\n\nprivileges\x18\x04 \x03(\x0b\x32/.tabletmanagerdata.DbPermission.PrivilegesEntry\x1a\x31\n\x0fPrivilegesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x83\x01\n\x0bPermissions\x12;\n\x10user_permissions\x18\x01 \x03(\x0b\x32!.tabletmanagerdata.UserPermission\x12\x37\n\x0e\x64\x62_permissions\x18\x02 \x03(\x0b\x32\x1f.tabletmanagerdata.DbPermission\"\x1e\n\x0bPingRequest\x12\x0f\n\x07payload\x18\x01 \x01(\t\"\x1f\n\x0cPingResponse\x12\x0f\n\x07payload\x18\x01 \x01(\t\" \n\x0cSleepRequest\x12\x10\n\x08\x64uration\x18\x01 \x01(\x03\"\x0f\n\rSleepResponse\"\xaf\x01\n\x12\x45xecuteHookRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nparameters\x18\x02 \x03(\t\x12\x46\n\textra_env\x18\x03 \x03(\x0b\x32\x33.tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry\x1a/\n\rExtraEnvEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"J\n\x13\x45xecuteHookResponse\x12\x13\n\x0b\x65xit_status\x18\x01 \x01(\x03\x12\x0e\n\x06stdout\x18\x02 \x01(\t\x12\x0e\n\x06stderr\x18\x03 \x01(\t\"Q\n\x10GetSchemaRequest\x12\x0e\n\x06tables\x18\x01 \x03(\t\x12\x15\n\rinclude_views\x18\x02 \x01(\x08\x12\x16\n\x0e\x65xclude_tables\x18\x03 \x03(\t\"S\n\x11GetSchemaResponse\x12>\n\x11schema_definition\x18\x01 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\x17\n\x15GetPermissionsRequest\"M\n\x16GetPermissionsResponse\x12\x33\n\x0bpermissions\x18\x01 \x01(\x0b\x32\x1e.tabletmanagerdata.Permissions\"\x14\n\x12SetReadOnlyRequest\"\x15\n\x13SetReadOnlyResponse\"\x15\n\x13SetReadWriteRequest\"\x16\n\x14SetReadWriteResponse\">\n\x11\x43hangeTypeRequest\x12)\n\x0btablet_type\x18\x01 \x01(\x0e\x32\x14.topodata.TabletType\"\x14\n\x12\x43hangeTypeResponse\"\x15\n\x13RefreshStateRequest\"\x16\n\x14RefreshStateResponse\"\x17\n\x15RunHealthCheckRequest\"\x18\n\x16RunHealthCheckResponse\"+\n\x18IgnoreHealthErrorRequest\x12\x0f\n\x07pattern\x18\x01 \x01(\t\"\x1b\n\x19IgnoreHealthErrorResponse\",\n\x13ReloadSchemaRequest\x12\x15\n\rwait_position\x18\x01 \x01(\t\"\x16\n\x14ReloadSchemaResponse\")\n\x16PreflightSchemaRequest\x12\x0f\n\x07\x63hanges\x18\x01 \x03(\t\"X\n\x17PreflightSchemaResponse\x12=\n\x0e\x63hange_results\x18\x01 \x03(\x0b\x32%.tabletmanagerdata.SchemaChangeResult\"\xc2\x01\n\x12\x41pplySchemaRequest\x12\x0b\n\x03sql\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x12\x19\n\x11\x61llow_replication\x18\x03 \x01(\x08\x12:\n\rbefore_schema\x18\x04 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\x12\x39\n\x0c\x61\x66ter_schema\x18\x05 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\x8c\x01\n\x13\x41pplySchemaResponse\x12:\n\rbefore_schema\x18\x01 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\x12\x39\n\x0c\x61\x66ter_schema\x18\x02 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\x13\n\x11LockTablesRequest\"\x14\n\x12LockTablesResponse\"\x15\n\x13UnlockTablesRequest\"\x16\n\x14UnlockTablesResponse\"|\n\x18\x45xecuteFetchAsDbaRequest\x12\r\n\x05query\x18\x01 \x01(\x0c\x12\x0f\n\x07\x64\x62_name\x18\x02 \x01(\t\x12\x10\n\x08max_rows\x18\x03 \x01(\x04\x12\x17\n\x0f\x64isable_binlogs\x18\x04 \x01(\x08\x12\x15\n\rreload_schema\x18\x05 \x01(\x08\"?\n\x19\x45xecuteFetchAsDbaResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"h\n\x1d\x45xecuteFetchAsAllPrivsRequest\x12\r\n\x05query\x18\x01 \x01(\x0c\x12\x0f\n\x07\x64\x62_name\x18\x02 \x01(\t\x12\x10\n\x08max_rows\x18\x03 \x01(\x04\x12\x15\n\rreload_schema\x18\x04 \x01(\x08\"D\n\x1e\x45xecuteFetchAsAllPrivsResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\";\n\x18\x45xecuteFetchAsAppRequest\x12\r\n\x05query\x18\x01 \x01(\x0c\x12\x10\n\x08max_rows\x18\x02 \x01(\x04\"?\n\x19\x45xecuteFetchAsAppResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\x14\n\x12SlaveStatusRequest\">\n\x13SlaveStatusResponse\x12\'\n\x06status\x18\x01 \x01(\x0b\x32\x17.replicationdata.Status\"\x17\n\x15MasterPositionRequest\"*\n\x16MasterPositionResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x12\n\x10StopSlaveRequest\"\x13\n\x11StopSlaveResponse\"A\n\x17StopSlaveMinimumRequest\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x14\n\x0cwait_timeout\x18\x02 \x01(\x03\",\n\x18StopSlaveMinimumResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x13\n\x11StartSlaveRequest\"\x14\n\x12StartSlaveResponse\"E\n\x1bStartSlaveUntilAfterRequest\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x14\n\x0cwait_timeout\x18\x02 \x01(\x03\"\x1e\n\x1cStartSlaveUntilAfterResponse\"8\n!TabletExternallyReparentedRequest\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\"$\n\"TabletExternallyReparentedResponse\" \n\x1eTabletExternallyElectedRequest\"!\n\x1fTabletExternallyElectedResponse\"\x12\n\x10GetSlavesRequest\"\"\n\x11GetSlavesResponse\x12\r\n\x05\x61\x64\x64rs\x18\x01 \x03(\t\"\x19\n\x17ResetReplicationRequest\"\x1a\n\x18ResetReplicationResponse\"(\n\x17VReplicationExecRequest\x12\r\n\x05query\x18\x01 \x01(\t\">\n\x18VReplicationExecResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"=\n\x1dVReplicationWaitForPosRequest\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08position\x18\x02 \x01(\t\" \n\x1eVReplicationWaitForPosResponse\"\x13\n\x11InitMasterRequest\"&\n\x12InitMasterResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x99\x01\n\x1ePopulateReparentJournalRequest\x12\x17\n\x0ftime_created_ns\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\t\x12+\n\x0cmaster_alias\x18\x03 \x01(\x0b\x32\x15.topodata.TabletAlias\x12\x1c\n\x14replication_position\x18\x04 \x01(\t\"!\n\x1fPopulateReparentJournalResponse\"p\n\x10InitSlaveRequest\x12%\n\x06parent\x18\x01 \x01(\x0b\x32\x15.topodata.TabletAlias\x12\x1c\n\x14replication_position\x18\x02 \x01(\t\x12\x17\n\x0ftime_created_ns\x18\x03 \x01(\x03\"\x13\n\x11InitSlaveResponse\"\x15\n\x13\x44\x65moteMasterRequest\"(\n\x14\x44\x65moteMasterResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"3\n\x1fPromoteSlaveWhenCaughtUpRequest\x12\x10\n\x08position\x18\x01 \x01(\t\"4\n PromoteSlaveWhenCaughtUpResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x19\n\x17SlaveWasPromotedRequest\"\x1a\n\x18SlaveWasPromotedResponse\"m\n\x10SetMasterRequest\x12%\n\x06parent\x18\x01 \x01(\x0b\x32\x15.topodata.TabletAlias\x12\x17\n\x0ftime_created_ns\x18\x02 \x01(\x03\x12\x19\n\x11\x66orce_start_slave\x18\x03 \x01(\x08\"\x13\n\x11SetMasterResponse\"A\n\x18SlaveWasRestartedRequest\x12%\n\x06parent\x18\x01 \x01(\x0b\x32\x15.topodata.TabletAlias\"\x1b\n\x19SlaveWasRestartedResponse\"$\n\"StopReplicationAndGetStatusRequest\"N\n#StopReplicationAndGetStatusResponse\x12\'\n\x06status\x18\x01 \x01(\x0b\x32\x17.replicationdata.Status\"\x15\n\x13PromoteSlaveRequest\"(\n\x14PromoteSlaveResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"$\n\rBackupRequest\x12\x13\n\x0b\x63oncurrency\x18\x01 \x01(\x03\"/\n\x0e\x42\x61\x63kupResponse\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.logutil.Event\"\x1a\n\x18RestoreFromBackupRequest\":\n\x19RestoreFromBackupResponse\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.logutil.EventB0Z.vitess.io/vitess/go/vt/proto/tabletmanagerdatab\x06proto3') + serialized_options=_b('Z.vitess.io/vitess/go/vt/proto/tabletmanagerdata'), + serialized_pb=_b('\n\x17tabletmanagerdata.proto\x12\x11tabletmanagerdata\x1a\x0bquery.proto\x1a\x0etopodata.proto\x1a\x15replicationdata.proto\x1a\rlogutil.proto\"\x93\x01\n\x0fTableDefinition\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x0f\n\x07\x63olumns\x18\x03 \x03(\t\x12\x1b\n\x13primary_key_columns\x18\x04 \x03(\t\x12\x0c\n\x04type\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x61ta_length\x18\x06 \x01(\x04\x12\x11\n\trow_count\x18\x07 \x01(\x04\"{\n\x10SchemaDefinition\x12\x17\n\x0f\x64\x61tabase_schema\x18\x01 \x01(\t\x12=\n\x11table_definitions\x18\x02 \x03(\x0b\x32\".tabletmanagerdata.TableDefinition\x12\x0f\n\x07version\x18\x03 \x01(\t\"\x8b\x01\n\x12SchemaChangeResult\x12:\n\rbefore_schema\x18\x01 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\x12\x39\n\x0c\x61\x66ter_schema\x18\x02 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\xc1\x01\n\x0eUserPermission\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04user\x18\x02 \x01(\t\x12\x19\n\x11password_checksum\x18\x03 \x01(\x04\x12\x45\n\nprivileges\x18\x04 \x03(\x0b\x32\x31.tabletmanagerdata.UserPermission.PrivilegesEntry\x1a\x31\n\x0fPrivilegesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xae\x01\n\x0c\x44\x62Permission\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\n\n\x02\x64\x62\x18\x02 \x01(\t\x12\x0c\n\x04user\x18\x03 \x01(\t\x12\x43\n\nprivileges\x18\x04 \x03(\x0b\x32/.tabletmanagerdata.DbPermission.PrivilegesEntry\x1a\x31\n\x0fPrivilegesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x83\x01\n\x0bPermissions\x12;\n\x10user_permissions\x18\x01 \x03(\x0b\x32!.tabletmanagerdata.UserPermission\x12\x37\n\x0e\x64\x62_permissions\x18\x02 \x03(\x0b\x32\x1f.tabletmanagerdata.DbPermission\"\x1e\n\x0bPingRequest\x12\x0f\n\x07payload\x18\x01 \x01(\t\"\x1f\n\x0cPingResponse\x12\x0f\n\x07payload\x18\x01 \x01(\t\" \n\x0cSleepRequest\x12\x10\n\x08\x64uration\x18\x01 \x01(\x03\"\x0f\n\rSleepResponse\"\xaf\x01\n\x12\x45xecuteHookRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nparameters\x18\x02 \x03(\t\x12\x46\n\textra_env\x18\x03 \x03(\x0b\x32\x33.tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry\x1a/\n\rExtraEnvEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"J\n\x13\x45xecuteHookResponse\x12\x13\n\x0b\x65xit_status\x18\x01 \x01(\x03\x12\x0e\n\x06stdout\x18\x02 \x01(\t\x12\x0e\n\x06stderr\x18\x03 \x01(\t\"Q\n\x10GetSchemaRequest\x12\x0e\n\x06tables\x18\x01 \x03(\t\x12\x15\n\rinclude_views\x18\x02 \x01(\x08\x12\x16\n\x0e\x65xclude_tables\x18\x03 \x03(\t\"S\n\x11GetSchemaResponse\x12>\n\x11schema_definition\x18\x01 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\x17\n\x15GetPermissionsRequest\"M\n\x16GetPermissionsResponse\x12\x33\n\x0bpermissions\x18\x01 \x01(\x0b\x32\x1e.tabletmanagerdata.Permissions\"\x14\n\x12SetReadOnlyRequest\"\x15\n\x13SetReadOnlyResponse\"\x15\n\x13SetReadWriteRequest\"\x16\n\x14SetReadWriteResponse\">\n\x11\x43hangeTypeRequest\x12)\n\x0btablet_type\x18\x01 \x01(\x0e\x32\x14.topodata.TabletType\"\x14\n\x12\x43hangeTypeResponse\"\x15\n\x13RefreshStateRequest\"\x16\n\x14RefreshStateResponse\"\x17\n\x15RunHealthCheckRequest\"\x18\n\x16RunHealthCheckResponse\"+\n\x18IgnoreHealthErrorRequest\x12\x0f\n\x07pattern\x18\x01 \x01(\t\"\x1b\n\x19IgnoreHealthErrorResponse\",\n\x13ReloadSchemaRequest\x12\x15\n\rwait_position\x18\x01 \x01(\t\"\x16\n\x14ReloadSchemaResponse\")\n\x16PreflightSchemaRequest\x12\x0f\n\x07\x63hanges\x18\x01 \x03(\t\"X\n\x17PreflightSchemaResponse\x12=\n\x0e\x63hange_results\x18\x01 \x03(\x0b\x32%.tabletmanagerdata.SchemaChangeResult\"\xc2\x01\n\x12\x41pplySchemaRequest\x12\x0b\n\x03sql\x18\x01 \x01(\t\x12\r\n\x05\x66orce\x18\x02 \x01(\x08\x12\x19\n\x11\x61llow_replication\x18\x03 \x01(\x08\x12:\n\rbefore_schema\x18\x04 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\x12\x39\n\x0c\x61\x66ter_schema\x18\x05 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\x8c\x01\n\x13\x41pplySchemaResponse\x12:\n\rbefore_schema\x18\x01 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\x12\x39\n\x0c\x61\x66ter_schema\x18\x02 \x01(\x0b\x32#.tabletmanagerdata.SchemaDefinition\"\x13\n\x11LockTablesRequest\"\x14\n\x12LockTablesResponse\"\x15\n\x13UnlockTablesRequest\"\x16\n\x14UnlockTablesResponse\"|\n\x18\x45xecuteFetchAsDbaRequest\x12\r\n\x05query\x18\x01 \x01(\x0c\x12\x0f\n\x07\x64\x62_name\x18\x02 \x01(\t\x12\x10\n\x08max_rows\x18\x03 \x01(\x04\x12\x17\n\x0f\x64isable_binlogs\x18\x04 \x01(\x08\x12\x15\n\rreload_schema\x18\x05 \x01(\x08\"?\n\x19\x45xecuteFetchAsDbaResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"h\n\x1d\x45xecuteFetchAsAllPrivsRequest\x12\r\n\x05query\x18\x01 \x01(\x0c\x12\x0f\n\x07\x64\x62_name\x18\x02 \x01(\t\x12\x10\n\x08max_rows\x18\x03 \x01(\x04\x12\x15\n\rreload_schema\x18\x04 \x01(\x08\"D\n\x1e\x45xecuteFetchAsAllPrivsResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\";\n\x18\x45xecuteFetchAsAppRequest\x12\r\n\x05query\x18\x01 \x01(\x0c\x12\x10\n\x08max_rows\x18\x02 \x01(\x04\"?\n\x19\x45xecuteFetchAsAppResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"\x14\n\x12SlaveStatusRequest\">\n\x13SlaveStatusResponse\x12\'\n\x06status\x18\x01 \x01(\x0b\x32\x17.replicationdata.Status\"\x17\n\x15MasterPositionRequest\"*\n\x16MasterPositionResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x12\n\x10StopSlaveRequest\"\x13\n\x11StopSlaveResponse\"A\n\x17StopSlaveMinimumRequest\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x14\n\x0cwait_timeout\x18\x02 \x01(\x03\",\n\x18StopSlaveMinimumResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x13\n\x11StartSlaveRequest\"\x14\n\x12StartSlaveResponse\"E\n\x1bStartSlaveUntilAfterRequest\x12\x10\n\x08position\x18\x01 \x01(\t\x12\x14\n\x0cwait_timeout\x18\x02 \x01(\x03\"\x1e\n\x1cStartSlaveUntilAfterResponse\"8\n!TabletExternallyReparentedRequest\x12\x13\n\x0b\x65xternal_id\x18\x01 \x01(\t\"$\n\"TabletExternallyReparentedResponse\" \n\x1eTabletExternallyElectedRequest\"!\n\x1fTabletExternallyElectedResponse\"\x12\n\x10GetSlavesRequest\"\"\n\x11GetSlavesResponse\x12\r\n\x05\x61\x64\x64rs\x18\x01 \x03(\t\"\x19\n\x17ResetReplicationRequest\"\x1a\n\x18ResetReplicationResponse\"(\n\x17VReplicationExecRequest\x12\r\n\x05query\x18\x01 \x01(\t\">\n\x18VReplicationExecResponse\x12\"\n\x06result\x18\x01 \x01(\x0b\x32\x12.query.QueryResult\"=\n\x1dVReplicationWaitForPosRequest\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x10\n\x08position\x18\x02 \x01(\t\" \n\x1eVReplicationWaitForPosResponse\"\x13\n\x11InitMasterRequest\"&\n\x12InitMasterResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x99\x01\n\x1ePopulateReparentJournalRequest\x12\x17\n\x0ftime_created_ns\x18\x01 \x01(\x03\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x01(\t\x12+\n\x0cmaster_alias\x18\x03 \x01(\x0b\x32\x15.topodata.TabletAlias\x12\x1c\n\x14replication_position\x18\x04 \x01(\t\"!\n\x1fPopulateReparentJournalResponse\"p\n\x10InitSlaveRequest\x12%\n\x06parent\x18\x01 \x01(\x0b\x32\x15.topodata.TabletAlias\x12\x1c\n\x14replication_position\x18\x02 \x01(\t\x12\x17\n\x0ftime_created_ns\x18\x03 \x01(\x03\"\x13\n\x11InitSlaveResponse\"\x15\n\x13\x44\x65moteMasterRequest\"(\n\x14\x44\x65moteMasterResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"3\n\x1fPromoteSlaveWhenCaughtUpRequest\x12\x10\n\x08position\x18\x01 \x01(\t\"4\n PromoteSlaveWhenCaughtUpResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"\x19\n\x17SlaveWasPromotedRequest\"\x1a\n\x18SlaveWasPromotedResponse\"m\n\x10SetMasterRequest\x12%\n\x06parent\x18\x01 \x01(\x0b\x32\x15.topodata.TabletAlias\x12\x17\n\x0ftime_created_ns\x18\x02 \x01(\x03\x12\x19\n\x11\x66orce_start_slave\x18\x03 \x01(\x08\"\x13\n\x11SetMasterResponse\"A\n\x18SlaveWasRestartedRequest\x12%\n\x06parent\x18\x01 \x01(\x0b\x32\x15.topodata.TabletAlias\"\x1b\n\x19SlaveWasRestartedResponse\"$\n\"StopReplicationAndGetStatusRequest\"N\n#StopReplicationAndGetStatusResponse\x12\'\n\x06status\x18\x01 \x01(\x0b\x32\x17.replicationdata.Status\"\x15\n\x13PromoteSlaveRequest\"(\n\x14PromoteSlaveResponse\x12\x10\n\x08position\x18\x01 \x01(\t\"9\n\rBackupRequest\x12\x13\n\x0b\x63oncurrency\x18\x01 \x01(\x03\x12\x13\n\x0b\x61llowMaster\x18\x02 \x01(\x08\"/\n\x0e\x42\x61\x63kupResponse\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.logutil.Event\"\x1a\n\x18RestoreFromBackupRequest\":\n\x19RestoreFromBackupResponse\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.logutil.EventB0Z.vitess.io/vitess/go/vt/proto/tabletmanagerdatab\x06proto3') , dependencies=[query__pb2.DESCRIPTOR,topodata__pb2.DESCRIPTOR,replicationdata__pb2.DESCRIPTOR,logutil__pb2.DESCRIPTOR,]) @@ -43,56 +43,56 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='schema', full_name='tabletmanagerdata.TableDefinition.schema', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='columns', full_name='tabletmanagerdata.TableDefinition.columns', index=2, number=3, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='primary_key_columns', full_name='tabletmanagerdata.TableDefinition.primary_key_columns', index=3, number=4, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='type', full_name='tabletmanagerdata.TableDefinition.type', index=4, number=5, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='data_length', full_name='tabletmanagerdata.TableDefinition.data_length', index=5, number=6, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='row_count', full_name='tabletmanagerdata.TableDefinition.row_count', index=6, number=7, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -116,28 +116,28 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='table_definitions', full_name='tabletmanagerdata.SchemaDefinition.table_definitions', index=1, number=2, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='version', full_name='tabletmanagerdata.SchemaDefinition.version', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -161,21 +161,21 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='after_schema', full_name='tabletmanagerdata.SchemaChangeResult.after_schema', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -199,21 +199,21 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='value', full_name='tabletmanagerdata.UserPermission.PrivilegesEntry.value', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')), + serialized_options=_b('8\001'), is_extendable=False, syntax='proto3', extension_ranges=[], @@ -236,35 +236,35 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='user', full_name='tabletmanagerdata.UserPermission.user', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='password_checksum', full_name='tabletmanagerdata.UserPermission.password_checksum', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='privileges', full_name='tabletmanagerdata.UserPermission.privileges', index=3, number=4, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[_USERPERMISSION_PRIVILEGESENTRY, ], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -288,21 +288,21 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='value', full_name='tabletmanagerdata.DbPermission.PrivilegesEntry.value', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')), + serialized_options=_b('8\001'), is_extendable=False, syntax='proto3', extension_ranges=[], @@ -325,35 +325,35 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='db', full_name='tabletmanagerdata.DbPermission.db', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='user', full_name='tabletmanagerdata.DbPermission.user', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='privileges', full_name='tabletmanagerdata.DbPermission.privileges', index=3, number=4, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[_DBPERMISSION_PRIVILEGESENTRY, ], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -377,21 +377,21 @@ has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='db_permissions', full_name='tabletmanagerdata.Permissions.db_permissions', index=1, number=2, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -415,14 +415,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -446,14 +446,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -477,14 +477,14 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -508,7 +508,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -532,21 +532,21 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='value', full_name='tabletmanagerdata.ExecuteHookRequest.ExtraEnvEntry.value', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')), + serialized_options=_b('8\001'), is_extendable=False, syntax='proto3', extension_ranges=[], @@ -569,28 +569,28 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='parameters', full_name='tabletmanagerdata.ExecuteHookRequest.parameters', index=1, number=2, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='extra_env', full_name='tabletmanagerdata.ExecuteHookRequest.extra_env', index=2, number=3, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[_EXECUTEHOOKREQUEST_EXTRAENVENTRY, ], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -614,28 +614,28 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='stdout', full_name='tabletmanagerdata.ExecuteHookResponse.stdout', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='stderr', full_name='tabletmanagerdata.ExecuteHookResponse.stderr', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -659,28 +659,28 @@ has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='include_views', full_name='tabletmanagerdata.GetSchemaRequest.include_views', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='exclude_tables', full_name='tabletmanagerdata.GetSchemaRequest.exclude_tables', index=2, number=3, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -704,14 +704,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -735,7 +735,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -759,14 +759,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -790,7 +790,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -814,7 +814,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -838,7 +838,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -862,7 +862,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -886,14 +886,14 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -917,7 +917,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -941,7 +941,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -965,7 +965,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -989,7 +989,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1013,7 +1013,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1037,14 +1037,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1068,7 +1068,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1092,14 +1092,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1123,7 +1123,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1147,14 +1147,14 @@ has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1178,14 +1178,14 @@ has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1209,42 +1209,42 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='force', full_name='tabletmanagerdata.ApplySchemaRequest.force', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='allow_replication', full_name='tabletmanagerdata.ApplySchemaRequest.allow_replication', index=2, number=3, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='before_schema', full_name='tabletmanagerdata.ApplySchemaRequest.before_schema', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='after_schema', full_name='tabletmanagerdata.ApplySchemaRequest.after_schema', index=4, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1268,21 +1268,21 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='after_schema', full_name='tabletmanagerdata.ApplySchemaResponse.after_schema', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1306,7 +1306,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1330,7 +1330,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1354,7 +1354,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1378,7 +1378,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1402,42 +1402,42 @@ has_default_value=False, default_value=_b(""), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='db_name', full_name='tabletmanagerdata.ExecuteFetchAsDbaRequest.db_name', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='max_rows', full_name='tabletmanagerdata.ExecuteFetchAsDbaRequest.max_rows', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='disable_binlogs', full_name='tabletmanagerdata.ExecuteFetchAsDbaRequest.disable_binlogs', index=3, number=4, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='reload_schema', full_name='tabletmanagerdata.ExecuteFetchAsDbaRequest.reload_schema', index=4, number=5, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1461,14 +1461,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1492,35 +1492,35 @@ has_default_value=False, default_value=_b(""), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='db_name', full_name='tabletmanagerdata.ExecuteFetchAsAllPrivsRequest.db_name', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='max_rows', full_name='tabletmanagerdata.ExecuteFetchAsAllPrivsRequest.max_rows', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='reload_schema', full_name='tabletmanagerdata.ExecuteFetchAsAllPrivsRequest.reload_schema', index=3, number=4, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1544,14 +1544,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1575,21 +1575,21 @@ has_default_value=False, default_value=_b(""), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='max_rows', full_name='tabletmanagerdata.ExecuteFetchAsAppRequest.max_rows', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1613,14 +1613,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1644,7 +1644,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1668,14 +1668,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1699,7 +1699,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1723,14 +1723,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1754,7 +1754,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1778,7 +1778,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1802,21 +1802,21 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='wait_timeout', full_name='tabletmanagerdata.StopSlaveMinimumRequest.wait_timeout', index=1, number=2, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1840,14 +1840,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1871,7 +1871,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1895,7 +1895,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1919,21 +1919,21 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='wait_timeout', full_name='tabletmanagerdata.StartSlaveUntilAfterRequest.wait_timeout', index=1, number=2, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1957,7 +1957,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -1981,14 +1981,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2012,7 +2012,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2036,7 +2036,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2060,7 +2060,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2084,7 +2084,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2108,14 +2108,14 @@ has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2139,7 +2139,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2163,7 +2163,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2187,14 +2187,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2218,14 +2218,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2249,21 +2249,21 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='position', full_name='tabletmanagerdata.VReplicationWaitForPosRequest.position', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2287,7 +2287,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2311,7 +2311,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2335,14 +2335,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2366,35 +2366,35 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='action_name', full_name='tabletmanagerdata.PopulateReparentJournalRequest.action_name', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='master_alias', full_name='tabletmanagerdata.PopulateReparentJournalRequest.master_alias', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='replication_position', full_name='tabletmanagerdata.PopulateReparentJournalRequest.replication_position', index=3, number=4, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2418,7 +2418,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2442,28 +2442,28 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='replication_position', full_name='tabletmanagerdata.InitSlaveRequest.replication_position', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='time_created_ns', full_name='tabletmanagerdata.InitSlaveRequest.time_created_ns', index=2, number=3, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2487,7 +2487,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2511,7 +2511,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2535,14 +2535,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2566,14 +2566,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2597,14 +2597,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2628,7 +2628,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2652,7 +2652,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2676,28 +2676,28 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='time_created_ns', full_name='tabletmanagerdata.SetMasterRequest.time_created_ns', index=1, number=2, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( name='force_start_slave', full_name='tabletmanagerdata.SetMasterRequest.force_start_slave', index=2, number=3, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2721,7 +2721,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2745,14 +2745,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2776,7 +2776,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2800,7 +2800,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2824,14 +2824,14 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2855,7 +2855,7 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2879,14 +2879,14 @@ has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], @@ -2910,21 +2910,28 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='allowMaster', full_name='tabletmanagerdata.BackupRequest.allowMaster', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], serialized_start=5114, - serialized_end=5150, + serialized_end=5171, ) @@ -2941,21 +2948,21 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=5152, - serialized_end=5199, + serialized_start=5173, + serialized_end=5220, ) @@ -2972,14 +2979,14 @@ nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=5201, - serialized_end=5227, + serialized_start=5222, + serialized_end=5248, ) @@ -2996,21 +3003,21 @@ has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None, file=DESCRIPTOR), + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], nested_types=[], enum_types=[ ], - options=None, + serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[ ], - serialized_start=5229, - serialized_end=5287, + serialized_start=5250, + serialized_end=5308, ) _SCHEMADEFINITION.fields_by_name['table_definitions'].message_type = _TABLEDEFINITION @@ -3807,12 +3814,8 @@ _sym_db.RegisterMessage(RestoreFromBackupResponse) -DESCRIPTOR.has_options = True -DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('Z.vitess.io/vitess/go/vt/proto/tabletmanagerdata')) -_USERPERMISSION_PRIVILEGESENTRY.has_options = True -_USERPERMISSION_PRIVILEGESENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) -_DBPERMISSION_PRIVILEGESENTRY.has_options = True -_DBPERMISSION_PRIVILEGESENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) -_EXECUTEHOOKREQUEST_EXTRAENVENTRY.has_options = True -_EXECUTEHOOKREQUEST_EXTRAENVENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) +DESCRIPTOR._options = None +_USERPERMISSION_PRIVILEGESENTRY._options = None +_DBPERMISSION_PRIVILEGESENTRY._options = None +_EXECUTEHOOKREQUEST_EXTRAENVENTRY._options = None # @@protoc_insertion_point(module_scope) diff --git a/test/backup.py b/test/backup.py index 78e8735fb9b..a4f19a4f3e6 100755 --- a/test/backup.py +++ b/test/backup.py @@ -27,6 +27,15 @@ import utils use_mysqlctld = False +use_xtrabackup = False +stream_mode = 'tar' +#TODO get path to xtrabackup using `which` +xtrabackup_args = ['-backup_engine_implementation', + 'xtrabackup', + '-xtrabackup_stream_mode', + stream_mode, + '-xtrabackup_backup_flags', + '--user=vt_dba --password=VtDbaPass'] tablet_master = None tablet_replica1 = None @@ -152,14 +161,15 @@ def setUp(self): for t in tablet_master, tablet_replica1: t.create_db('vt_test_keyspace') + xtra_args = ['-db-credentials-file', db_credentials_file] + if use_xtrabackup: + xtra_args.extend(xtrabackup_args) tablet_master.init_tablet('replica', 'test_keyspace', '0', start=True, supports_backups=True, - extra_args=['-db-credentials-file', - db_credentials_file]) + extra_args=xtra_args) tablet_replica1.init_tablet('replica', 'test_keyspace', '0', start=True, supports_backups=True, - extra_args=['-db-credentials-file', - db_credentials_file]) + extra_args=xtra_args) utils.run_vtctl(['InitShardMaster', '-force', 'test_keyspace/0', tablet_master.tablet_alias]) @@ -209,12 +219,17 @@ def _check_data(self, t, count, msg): def _restore(self, t, tablet_type='replica'): """Erase mysql/tablet dir, then start tablet with restore enabled.""" self._reset_tablet_dir(t) + + xtra_args = ['-db-credentials-file', db_credentials_file] + if use_xtrabackup: + xtra_args.extend(xtrabackup_args) + t.start_vttablet(wait_for_state='SERVING', init_tablet_type=tablet_type, init_keyspace='test_keyspace', init_shard='0', supports_backups=True, - extra_args=['-db-credentials-file', db_credentials_file]) + extra_args=xtra_args) # check semi-sync is enabled for replica, disabled for rdonly. if tablet_type == 'replica': @@ -282,6 +297,12 @@ def _test_backup(self, tablet_type): # backup the slave utils.run_vtctl(['Backup', tablet_replica1.tablet_alias], auto_log=True) + # check that the backup shows up in the listing + backups = self._list_backups() + logging.debug('list of backups: %s', backups) + self.assertEqual(len(backups), 1) + self.assertTrue(backups[0].endswith(tablet_replica1.tablet_alias)) + # insert more data on the master self._insert_data(tablet_master, 2) @@ -304,12 +325,6 @@ def _test_backup(self, tablet_type): else: self.assertEqual(metadata['PromotionRule'], 'must_not') - # check that the backup shows up in the listing - backups = self._list_backups() - logging.debug('list of backups: %s', backups) - self.assertEqual(len(backups), 1) - self.assertTrue(backups[0].endswith(tablet_replica1.tablet_alias)) - # remove the backup and check that the list is empty self._remove_backup(backups[0]) backups = self._list_backups() @@ -425,6 +440,9 @@ def _terminated_restore(t): def test_backup_transform(self): """Use a transform, tests we backup and restore properly.""" + if use_xtrabackup: + # not supported + return # Insert data on master, make sure slave gets it. tablet_master.mquery('vt_test_keyspace', self._create_vt_insert_test) self._insert_data(tablet_master, 1) @@ -432,13 +450,18 @@ def test_backup_transform(self): # Restart the replica with the transform parameter. tablet_replica1.kill_vttablet() + + xtra_args = ['-db-credentials-file', db_credentials_file] + if use_xtrabackup: + xtra_args.extend(xtrabackup_args) + + hook_args = ['-backup_storage_hook', + 'test_backup_transform', + '-backup_storage_compress=false'] + xtra_args.extend(hook_args) + tablet_replica1.start_vttablet(supports_backups=True, - extra_args=[ - '-backup_storage_hook', - 'test_backup_transform', - '-backup_storage_compress=false', - '-db-credentials-file', - db_credentials_file]) + extra_args=xtra_args) # Take a backup, it should work. utils.run_vtctl(['Backup', tablet_replica1.tablet_alias], auto_log=True) @@ -473,13 +496,18 @@ def test_backup_transform(self): def test_backup_transform_error(self): """Use a transform, force an error, make sure the backup fails.""" + if use_xtrabackup: + # not supported + return # Restart the replica with the transform parameter. tablet_replica1.kill_vttablet() + xtra_args = ['-db-credentials-file', db_credentials_file] + if use_xtrabackup: + xtra_args.extend(xtrabackup_args) + hook_args = ['-backup_storage_hook','test_backup_error'] + xtra_args.extend(hook_args) tablet_replica1.start_vttablet(supports_backups=True, - extra_args=['-backup_storage_hook', - 'test_backup_error', - '-db-credentials-file', - db_credentials_file]) + extra_args=xtra_args) # This will fail, make sure we get the right error. _, err = utils.run_vtctl(['Backup', tablet_replica1.tablet_alias], diff --git a/test/config.json b/test/config.json index d629184ec8e..1844b96b398 100644 --- a/test/config.json +++ b/test/config.json @@ -19,6 +19,24 @@ "RetryMax": 0, "Tags": [] }, + "xtrabackup": { + "File": "xtrabackup.py", + "Args": [], + "Command": [], + "Manual": false, + "Shard": 3, + "RetryMax": 0, + "Tags": [] + }, + "xtrabackup_xbstream": { + "File": "xtrabackup_xbstream.py", + "Args": [], + "Command": [], + "Manual": false, + "Shard": 3, + "RetryMax": 0, + "Tags": [] + }, "binlog": { "File": "binlog.py", "Args": [], diff --git a/test/xtrabackup.py b/test/xtrabackup.py new file mode 100755 index 00000000000..135bdf60ce8 --- /dev/null +++ b/test/xtrabackup.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# Copyright 2019 The Vitess Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +"""Re-runs backup.py with use_xtrabackup=True.""" + +import backup +import utils + +if __name__ == '__main__': + backup.use_xtrabackup = True + utils.main(backup) diff --git a/test/xtrabackup_xbstream.py b/test/xtrabackup_xbstream.py new file mode 100755 index 00000000000..751d2f6af62 --- /dev/null +++ b/test/xtrabackup_xbstream.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +# Copyright 2019 The Vitess Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +"""Re-runs backup.py with use_xtrabackup=True.""" + +import backup +import utils + +if __name__ == '__main__': + backup.use_xtrabackup = True + backup.stream_mode = 'xbstream' + utils.main(backup)