Merge remote-tracking branch 'upstream/master' into cluster_for_test

Signed-off-by: Morgan Tocker <tocker@gmail.com>
This commit is contained in:
Morgan Tocker 2019-11-07 12:15:34 -07:00
Родитель c88c678592 79933cfe48
Коммит e79b8451a9
221 изменённых файлов: 8709 добавлений и 2522 удалений

173
.github/bootstrap.sh поставляемый Executable file
Просмотреть файл

@ -0,0 +1,173 @@
#!/bin/bash
# shellcheck disable=SC2164
# 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.
# This is a next-gen bootstrap which skips Python and Java tests,
# and does not use the VTROOT/VTTOP layout.
#
# My original intention was to use the same bootstrap.sh and gate
# for new features, but it has turned out to be difficult to do,
# due to the way that Docker cache works in the CI environment.
function fail() {
echo "ERROR: $1"
exit 1
}
[[ "$(dirname "$0")" = "." ]] || fail "bootstrap.sh must be run from its current directory"
# Create main directories.
VTROOT="$PWD"
mkdir -p dist
mkdir -p bin
mkdir -p lib
mkdir -p vthook
source ./dev.env
go version &>/dev/null || fail "Go is not installed or is not on \$PATH"
goversion_min 1.12 || fail "Go is not version 1.12+"
# Set up required soft links.
# TODO(mberlin): Which of these can be deleted?
ln -snf "$VTROOT/py" "$VTROOT/py-vtdb"
ln -snf "$VTROOT/go/vt/zkctl/zksrv.sh" "$VTROOT/bin/zksrv.sh"
ln -snf "$VTROOT/test/vthook-test.sh" "$VTROOT/vthook/test.sh"
ln -snf "$VTROOT/test/vthook-test_backup_error" "$VTROOT/vthook/test_backup_error"
ln -snf "$VTROOT/test/vthook-test_backup_transform" "$VTROOT/vthook/test_backup_transform"
# git hooks are only required if someone intends to contribute.
echo "creating git hooks"
mkdir -p "$VTROOT/.git/hooks"
ln -sf "$VTROOT/misc/git/pre-commit" "$VTROOT/.git/hooks/pre-commit"
ln -sf "$VTROOT/misc/git/commit-msg" "$VTROOT/.git/hooks/commit-msg"
git config core.hooksPath "$VTROOT/.git/hooks"
# install_dep is a helper function to generalize the download and installation of dependencies.
#
# If the installation is successful, it puts the installed version string into
# the $dist/.installed_version file. If the version has not changed, bootstrap
# will skip future installations.
function install_dep() {
if [[ $# != 4 ]]; then
fail "install_dep function requires exactly 4 parameters (and not $#). Parameters: $*"
fi
local name="$1"
local version="$2"
local dist="$3"
local install_func="$4"
version_file="$dist/.installed_version"
if [[ -f "$version_file" && "$(cat "$version_file")" == "$version" ]]; then
echo "skipping $name install. remove $dist to force re-install."
return
fi
echo "installing $name $version"
# shellcheck disable=SC2064
trap "fail '$name build failed'; exit 1" ERR
# Cleanup any existing data and re-create the directory.
rm -rf "$dist"
mkdir -p "$dist"
# Change $CWD to $dist before calling "install_func".
pushd "$dist" >/dev/null
# -E (same as "set -o errtrace") makes sure that "install_func" inherits the
# trap. If here's an error, the trap will be called which will exit this
# script.
set -E
$install_func "$version" "$dist"
set +E
popd >/dev/null
trap - ERR
echo "$version" > "$version_file"
}
#
# 1. Installation of dependencies.
#
# Wrapper around the `arch` command which plays nice with OS X
function get_arch() {
case $(uname) in
Linux) arch;;
Darwin) uname -m;;
esac
}
# Install protoc.
function install_protoc() {
local version="$1"
local dist="$2"
case $(uname) in
Linux) local platform=linux;;
Darwin) local platform=osx;;
esac
case $(get_arch) in
aarch64) local target=aarch_64;;
x86_64) local target=x86_64;;
*) echo "ERROR: unsupported architecture"; exit 1;;
esac
wget https://github.com/protocolbuffers/protobuf/releases/download/v$version/protoc-$version-$platform-${target}.zip
unzip "protoc-$version-$platform-${target}.zip"
ln -snf "$dist/bin/protoc" "$VTROOT/bin/protoc"
}
protoc_ver=3.6.1
install_dep "protoc" "$protoc_ver" "$VTROOT/dist/vt-protoc-$protoc_ver" install_protoc
# Download and install etcd, link etcd binary into our root.
function install_etcd() {
local version="$1"
local dist="$2"
case $(uname) in
Linux) local platform=linux; local ext=tar.gz;;
Darwin) local platform=darwin; local ext=zip;;
esac
case $(get_arch) in
aarch64) local target=arm64;;
x86_64) local target=amd64;;
*) echo "ERROR: unsupported architecture"; exit 1;;
esac
download_url=https://github.com/coreos/etcd/releases/download
file="etcd-${version}-${platform}-${target}.${ext}"
wget "$download_url/$version/$file"
if [ "$ext" = "tar.gz" ]; then
tar xzf "$file"
else
unzip "$file"
fi
rm "$file"
ln -snf "$dist/etcd-${version}-${platform}-${target}/etcd" "$VTROOT/bin/etcd"
}
install_dep "etcd" "v3.3.10" "$VTROOT/dist/etcd" install_etcd
echo
echo "bootstrap finished"

42
.github/workflows/local-example.yml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,42 @@
name: Go
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Set up Go
uses: actions/setup-go@v1
with:
go-version: 1.13
id: local-example
- name: Check out code
uses: actions/checkout@v1
- name: Get dependencies
run: |
sudo apt-get install -y mysql-server mysql-client make unzip g++ etcd curl git wget
sudo service mysql stop
sudo service etcd stop
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
go mod download
- name: Run bootstrap.sh
run: |
echo "Copying new bootstrap over location of legacy one."
cp .github/bootstrap.sh .
./bootstrap.sh
- name: Build
run: |
GOBIN=$PWD/bin make build
- name: Run Local Example
run: |
export PATH=$PWD/bin:$PATH
VTDATAROOT=/tmp/vtdataroot VTTOP=$PWD VTROOT=$PWD test/local_example.sh

Просмотреть файл

@ -1,4 +1,4 @@
# Copyright 2017 Google Inc.
# 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.

Просмотреть файл

@ -1,7 +1,7 @@
#!/bin/bash
# shellcheck disable=SC2164
# Copyright 2017 Google Inc.
# 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.
@ -35,10 +35,8 @@ function fail() {
[[ "$(dirname "$0")" = "." ]] || fail "bootstrap.sh must be run from its current directory"
go version &>/dev/null || fail "Go is not installed or is not on \$PATH"
[[ "$(go version 2>&1)" =~ go1\.[1-9][1-9] ]] || fail "Go is not version 1.11+"
# Create main directories.
VTROOT="${VTROOT:-${PWD/\/src\/vitess.io\/vitess/}}"
mkdir -p "$VTROOT/dist"
mkdir -p "$VTROOT/bin"
mkdir -p "$VTROOT/lib"
@ -53,6 +51,9 @@ else
source ./build.env
fi
go version &>/dev/null || fail "Go is not installed or is not on \$PATH"
goversion_min 1.12 || fail "Go is not version 1.12+"
if [ "$BUILD_TESTS" == 1 ] ; then
# Set up required soft links.
# TODO(mberlin): Which of these can be deleted?
@ -126,6 +127,14 @@ function install_dep() {
# 1. Installation of dependencies.
#
# Wrapper around the `arch` command which plays nice with OS X
function get_arch() {
case $(uname) in
Linux) arch;;
Darwin) uname -m;;
esac
}
# Install the gRPC Python library (grpcio) and the protobuf gRPC Python plugin (grpcio-tools) from PyPI.
# Dependencies like the Python protobuf package will be installed automatically.
@ -164,7 +173,7 @@ function install_protoc() {
Darwin) local platform=osx;;
esac
case $(arch) in
case $(get_arch) in
aarch64) local target=aarch_64;;
x86_64) local target=x86_64;;
*) echo "ERROR: unsupported architecture"; exit 1;;
@ -209,7 +218,7 @@ function install_etcd() {
Darwin) local platform=darwin; local ext=zip;;
esac
case $(arch) in
case $(get_arch) in
aarch64) local target=arm64;;
x86_64) local target=amd64;;
*) echo "ERROR: unsupported architecture"; exit 1;;
@ -240,7 +249,7 @@ function install_consul() {
Darwin) local platform=darwin;;
esac
case $(arch) in
case $(get_arch) in
aarch64) local target=arm64;;
x86_64) local target=amd64;;
*) echo "ERROR: unsupported architecture"; exit 1;;

Просмотреть файл

@ -1,6 +1,6 @@
# No shebang line as this script is sourced from an external shell.
# Copyright 2017 Google Inc.
# 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.

Просмотреть файл

@ -1 +0,0 @@
# reserved for future tuning

Просмотреть файл

@ -1,7 +0,0 @@
innodb_doublewrite=0
innodb_flush_log_at_trx_commit=0
innodb_log_file_size=128M
innodb_buffer_pool_size=1G
max_connections=500
open_files_limit=8192
sync_binlog=0

Просмотреть файл

@ -1,12 +0,0 @@
# This file is auto-included when MariaDB (any version) is detected.
# enable strict mode so it's safe to compare sequence numbers across different server IDs.
gtid_strict_mode = 1
innodb_stats_persistent = 0
# When semi-sync is enabled, don't allow fallback to async
# if you get no ack, or have no slaves. This is necessary to
# prevent alternate futures when doing a failover in response to
# a master that becomes unresponsive.
rpl_semi_sync_master_timeout = 1000000000000000000
rpl_semi_sync_master_wait_no_slave = 1

Просмотреть файл

@ -10,3 +10,14 @@ innodb_support_xa = 0
# at the proper time when replication is set up, or when masters are
# promoted or demoted.
plugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
# enable strict mode so it's safe to compare sequence numbers across different server IDs.
gtid_strict_mode = 1
innodb_stats_persistent = 0
# When semi-sync is enabled, don't allow fallback to async
# if you get no ack, or have no slaves. This is necessary to
# prevent alternate futures when doing a failover in response to
# a master that becomes unresponsive.
rpl_semi_sync_master_timeout = 1000000000000000000
rpl_semi_sync_master_wait_no_slave = 1

Просмотреть файл

@ -10,3 +10,14 @@ innodb_support_xa = 0
# at the proper time when replication is set up, or when masters are
# promoted or demoted.
plugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
# enable strict mode so it's safe to compare sequence numbers across different server IDs.
gtid_strict_mode = 1
innodb_stats_persistent = 0
# When semi-sync is enabled, don't allow fallback to async
# if you get no ack, or have no slaves. This is necessary to
# prevent alternate futures when doing a failover in response to
# a master that becomes unresponsive.
rpl_semi_sync_master_timeout = 1000000000000000000
rpl_semi_sync_master_wait_no_slave = 1

Просмотреть файл

@ -10,3 +10,14 @@ innodb_support_xa = 0
# at the proper time when replication is set up, or when masters are
# promoted or demoted.
plugin-load = rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
# enable strict mode so it's safe to compare sequence numbers across different server IDs.
gtid_strict_mode = 1
innodb_stats_persistent = 0
# When semi-sync is enabled, don't allow fallback to async
# if you get no ack, or have no slaves. This is necessary to
# prevent alternate futures when doing a failover in response to
# a master that becomes unresponsive.
rpl_semi_sync_master_timeout = 1000000000000000000
rpl_semi_sync_master_wait_no_slave = 1

Просмотреть файл

@ -1,5 +0,0 @@
# Values for a production vitess deployment
innodb_buffer_pool_size = 1024M
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
max_connections = 1000

Просмотреть файл

@ -1 +0,0 @@
# reserved for future tuning

23
dev.env
Просмотреть файл

@ -1,6 +1,6 @@
# No shebang line as this script is sourced from an external shell.
# Copyright 2017 Google Inc.
# 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.
@ -55,17 +55,6 @@ export PIP
command -v virtualenv2 >/dev/null && VIRTUALENV=virtualenv2 || VIRTUALENV=virtualenv
export VIRTUALENV
# Add the current GOBIN
if [ "$GOBIN" ]; then
PATH=$(prepend_path "$PATH" "$GOBIN")
fi
# Many tests rely on "go install" and assume GOBIN is really $VTROOT/bin.
# Make sure these take precedence.
GOBIN=$VTROOT/bin
export GOBIN
PATH=$(prepend_path "$PATH" "$GOBIN")
# Add chromedriver to path for Selenium tests.
PATH=$(prepend_path "$PATH" "$VTROOT/dist/chromedriver")
@ -73,16 +62,6 @@ PATH=$(prepend_path "$PATH" "$VTROOT/dist/chromedriver")
PATH=$(prepend_path "$PATH" "$VTROOT/dist/node/bin")
export PATH
# GOROOT sanity
go_bin=$(which go)
go_env=$(go env | grep GOROOT | cut -f 2 -d\")
if [[ "$go_bin" != "" && "$go_bin" != "$go_env/bin/go" ]]; then
echo "WARNING: \$GOROOT may not be compatible with the used go binary"
echo "Please make sure 'go' comes from \$GOROOT/bin"
echo "go_env: $go_env"
echo "go_bin: $go_bin"
fi
# mysql install location. Please set based on your environment.
# Build will not work if this is incorrect.

Просмотреть файл

@ -29,8 +29,8 @@ import (
"strings"
jsonpatch "github.com/evanphx/json-patch"
yamlpatch "github.com/krishicks/yaml-patch"
"vitess.io/vitess/go/vt/log"
)

Просмотреть файл

@ -1,3 +1,3 @@
Flask==0.12.3
Flask==1.0
grpcio==1.12.0
grpcio-tools==1.12.0

Просмотреть файл

@ -34,7 +34,6 @@ CELL=zone1 "$script_root/vtctld-up.sh"
# start vttablets for keyspace commerce
CELL=zone1 KEYSPACE=commerce UID_BASE=100 "$script_root/vttablet-up.sh"
sleep 15
# set one of the replicas to master
./lvtctl.sh InitShardMaster -force commerce/0 zone1-100

Просмотреть файл

@ -24,7 +24,7 @@ set -e
script_root=$(dirname "${BASH_SOURCE}")
CELL=zone1 KEYSPACE=customer UID_BASE=200 "$script_root/vttablet-up.sh"
sleep 15
./lvtctl.sh InitShardMaster -force customer/0 zone1-200
./lvtctl.sh CopySchemaShard -tables customer,corder commerce/0 customer/0
./lvtctl.sh ApplyVSchema -vschema_file vschema_commerce_vsplit.json commerce

Просмотреть файл

@ -24,7 +24,7 @@ script_root=$(dirname "${BASH_SOURCE}")
SHARD=-80 CELL=zone1 KEYSPACE=customer UID_BASE=300 "$script_root/vttablet-up.sh"
SHARD=80- CELL=zone1 KEYSPACE=customer UID_BASE=400 "$script_root/vttablet-up.sh"
sleep 15
./lvtctl.sh InitShardMaster -force customer/-80 zone1-300
./lvtctl.sh InitShardMaster -force customer/80- zone1-400
./lvtctl.sh CopySchemaShard customer/0 customer/-80

Просмотреть файл

@ -14,10 +14,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# this script brings down zookeeper and all the vitess components
# we brought up in the example
# optionally, you may want to delete everything that was created
# by the example from $VTDATAROOT
# We should not assume that any of the steps have been executed.
# This makes it possible for a user to cleanup at any point.
set -e
@ -25,9 +23,11 @@ set -e
script_root=$(dirname "${BASH_SOURCE}")
./vtgate-down.sh
CELL=zone1 UID_BASE=100 "$script_root/vttablet-down.sh"
CELL=zone1 UID_BASE=300 "$script_root/vttablet-down.sh"
CELL=zone1 UID_BASE=400 "$script_root/vttablet-down.sh"
for TABLET in 100 200 300 400; do
./lvtctl.sh GetTablet zone1-$TABLET >/dev/null 2>&1 && CELL=zone1 UID_BASE=$TABLET "$script_root/vttablet-down.sh"
done;
./vtctld-down.sh
if [ "${TOPO}" = "zk2" ]; then
@ -36,6 +36,20 @@ else
CELL=zone1 "$script_root/etcd-down.sh"
fi
rm -r $VTDATAROOT/*
# pedantic check: grep for any remaining processes
if [ ! -z "$VTDATAROOT" ]; then
if pgrep -f -l "$VTDATAROOT" > /dev/null; then
echo "ERROR: Stale processes detected! It is recommended to manuallly kill them:"
pgrep -f -l "$VTDATAROOT"
else
echo "All good! It looks like every process has shut down"
fi
# shellcheck disable=SC2086
rm -r ${VTDATAROOT:?}/*
fi
disown -a

Просмотреть файл

@ -21,8 +21,7 @@ This is a sample for using the Python Vitess client.
It's a script that inserts some random messages on random pages of the
guestbook sample app.
Before running this, start up a local example cluster as described in the
README.md file.
Before running this, start up a local example cluster.
Then run client.sh, which sets up PYTHONPATH before running client.py:
vitess/examples/local$ ./client.sh

Просмотреть файл

@ -20,11 +20,11 @@ vtctld_web_port=15000
# Set up environment.
export VTTOP=${VTTOP-$VTROOT/src/vitess.io/vitess}
# Try to find mysqld_safe on PATH.
# Try to find mysqld on PATH.
if [ -z "$VT_MYSQL_ROOT" ]; then
mysql_path=`which mysqld_safe`
mysql_path=`which mysqld`
if [ -z "$mysql_path" ]; then
echo "Can't guess location of mysqld_safe. Please set VT_MYSQL_ROOT so it can be found at \$VT_MYSQL_ROOT/bin/mysqld_safe."
echo "Can't guess location of mysqld. Please set VT_MYSQL_ROOT manually."
exit 1
fi
export VT_MYSQL_ROOT=$(dirname `dirname $mysql_path`)

Просмотреть файл

@ -24,6 +24,6 @@ script_root=$(dirname "${BASH_SOURCE[0]}")
# shellcheck disable=SC1091
source "${script_root}/env.sh"
# Stop etcd servers.
echo "Stopping etcd servers..."
kill -9 "$(pgrep -f "${ETCD_BINDIR}/etcd")"
pid=`cat $VTDATAROOT/tmp/etcd.pid`
echo "Stopping etcd..."
kill -9 $pid

Просмотреть файл

@ -26,6 +26,8 @@ script_root=$(dirname "${BASH_SOURCE[0]}")
source "${script_root}/env.sh"
${ETCD_BINDIR}/etcd --data-dir "${VTDATAROOT}/etcd/" --listen-client-urls "http://${ETCD_SERVER}" --advertise-client-urls "http://${ETCD_SERVER}" > "${VTDATAROOT}"/tmp/etcd.out 2>&1 &
PID=$!
echo $PID > "${VTDATAROOT}/tmp/etcd.pid"
sleep 5
echo "add /vitess/global"

Просмотреть файл

@ -23,6 +23,4 @@ source $script_root/env.sh
pid=`cat $VTDATAROOT/tmp/vtctld.pid`
echo "Stopping vtctld..."
kill $pid
kill -9 "$(pgrep -f "/bin/vtctld")"
kill -9 $pid

Просмотреть файл

@ -89,6 +89,16 @@ $VTROOT/bin/vtgate \
$optional_tls_args \
> $VTDATAROOT/tmp/vtgate.out 2>&1 &
# Block waiting for vtgate to be listening
# Not the same as healthy
echo "Waiting for vtgate to be up..."
while true; do
curl -I "http://$hostname:$web_port/debug/status" >/dev/null 2>&1 && break
sleep 0.1
done;
echo "vtgate is up!"
echo "Access vtgate at http://$hostname:$web_port/debug/status"
disown -a

Просмотреть файл

@ -129,4 +129,17 @@ for uid_index in $uids; do
echo "Access tablet $alias at http://$hostname:$port/debug/status"
done
# Block waiting for all tablets to be listening
# Not the same as healthy
echo "Waiting for tablets to be listening..."
for uid_index in $uids; do
port=$[$port_base + $uid_index]
while true; do
curl -I "http://$hostname:$port/debug/status" >/dev/null 2>&1 && break
sleep 0.1
done;
done;
echo "Tablets up!"
disown -a

3
go.mod
Просмотреть файл

@ -24,7 +24,6 @@ require (
github.com/golang/mock v1.3.1
github.com/golang/protobuf v1.3.2
github.com/golang/snappy v0.0.0-20170215233205-553a64147049
github.com/google/btree v1.0.0 // indirect
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf // indirect
github.com/gorilla/websocket v0.0.0-20160912153041-2d1e4548da23
github.com/grpc-ecosystem/go-grpc-middleware v1.1.0
@ -49,8 +48,6 @@ require (
github.com/minio/minio-go v0.0.0-20190131015406-c8a261de75c1
github.com/mitchellh/go-testing-interface v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.1.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/olekukonko/tablewriter v0.0.0-20160115111002-cca8bbc07984
github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02
github.com/opentracing/opentracing-go v1.1.0

Просмотреть файл

@ -625,7 +625,7 @@ func (c *Conn) writeHandshakeResponse41(capabilities uint32, scrambledPassword [
// DbName, only if server supports it.
if params.DbName != "" && (capabilities&CapabilityClientConnectWithDB != 0) {
pos = writeNullString(data, pos, params.DbName)
c.SchemaName = params.DbName
c.schemaName = params.DbName
}
// Assume native client during response

Просмотреть файл

@ -110,10 +110,12 @@ type Conn struct {
// It is set during the initial handshake.
UserData Getter
// SchemaName is the default database name to use. It is set
// schemaName is the default database name to use. It is set
// during handshake, and by ComInitDb packets. Both client and
// servers maintain it.
SchemaName string
// servers maintain it. This member is private because it's
// non-authoritative: the client can change the schema name
// through the 'USE' statement, which will bypass this variable.
schemaName string
// ServerVersion is set during Connect with the server
// version. It is not changed afterwards. It is unused for
@ -731,7 +733,8 @@ func (c *Conn) handleNextCommand(handler Handler) error {
case ComInitDB:
db := c.parseComInitDB(data)
c.recycleReadPacket()
c.SchemaName = db
c.schemaName = db
handler.ComInitDB(c, db)
if err := c.writeOKPacket(0, 0, c.StatusFlags, 0); err != nil {
log.Errorf("Error writing ComInitDB result to %s: %v", c, err)
return err

Просмотреть файл

@ -313,6 +313,10 @@ func (db *DB) ConnectionClosed(c *mysql.Conn) {
delete(db.connections, c.ConnectionID)
}
// ComInitDB is part of the mysql.Handler interface.
func (db *DB) ComInitDB(c *mysql.Conn, schemaName string) {
}
// ComQuery is part of the mysql.Handler interface.
func (db *DB) ComQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error {
return db.Handler.HandleQuery(c, query, callback)

Просмотреть файл

@ -88,6 +88,10 @@ type Handler interface {
// ConnectionClosed is called when a connection is closed.
ConnectionClosed(c *Conn)
// InitDB is called once at the beginning to set db name,
// and subsequently for every ComInitDB event.
ComInitDB(c *Conn, schemaName string)
// ComQuery is called when a connection receives a query.
// Note the contents of the query slice may change after
// the first call to callback. So the Handler should not
@ -447,6 +451,9 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
log.Warningf("Slow connection from %s: %v", c, connectTime)
}
// Set initial db name.
l.handler.ComInitDB(c, c.schemaName)
for {
err := c.handleNextCommand(l.handler)
if err != nil {
@ -674,7 +681,7 @@ func (l *Listener) parseClientHandshakePacket(c *Conn, firstTime bool, data []by
if !ok {
return "", "", nil, vterrors.Errorf(vtrpc.Code_INTERNAL, "parseClientHandshakePacket: can't read dbname")
}
c.SchemaName = dbname
c.schemaName = dbname
}
// authMethod (with default)

Просмотреть файл

@ -75,7 +75,9 @@ func (th *testHandler) NewConnection(c *Conn) {
}
func (th *testHandler) ConnectionClosed(c *Conn) {
}
func (th *testHandler) ComInitDB(c *Conn, schemaName string) {
}
func (th *testHandler) ComQuery(c *Conn, query string, callback func(*sqltypes.Result) error) error {
@ -109,7 +111,7 @@ func (th *testHandler) ComQuery(c *Conn, query string, callback func(*sqltypes.R
},
Rows: [][]sqltypes.Value{
{
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte(c.SchemaName)),
sqltypes.MakeTrusted(querypb.Type_VARCHAR, []byte(c.schemaName)),
},
},
})

Просмотреть файл

@ -656,6 +656,22 @@ func (l *listener) StatsUpdate(ts *TabletStats) {
l.output <- ts
}
type fakeConn struct {
queryservice.QueryService
tablet *topodatapb.Tablet
// If fixedResult is set, the channels are not used.
fixedResult *querypb.StreamHealthResponse
// hcChan should be an unbuffered channel which holds the tablet's next health response.
hcChan chan *querypb.StreamHealthResponse
// errCh is either an unbuffered channel which holds the stream error to return, or nil.
errCh chan error
// cbErrCh is a channel which receives errors returned from the supplied callback.
cbErrCh chan error
mu sync.Mutex
canceled bool
}
func createFakeConn(tablet *topodatapb.Tablet, c chan *querypb.StreamHealthResponse) *fakeConn {
key := TabletToMapKey(tablet)
conn := &fakeConn{
@ -668,27 +684,27 @@ func createFakeConn(tablet *topodatapb.Tablet, c chan *querypb.StreamHealthRespo
return conn
}
func createFixedHealthConn(tablet *topodatapb.Tablet, fixedResult *querypb.StreamHealthResponse) *fakeConn {
key := TabletToMapKey(tablet)
conn := &fakeConn{
QueryService: fakes.ErrorQueryService,
tablet: tablet,
fixedResult: fixedResult,
}
connMap[key] = conn
return conn
}
func discoveryDialer(tablet *topodatapb.Tablet, failFast grpcclient.FailFast) (queryservice.QueryService, error) {
key := TabletToMapKey(tablet)
return connMap[key], nil
}
type fakeConn struct {
queryservice.QueryService
tablet *topodatapb.Tablet
// hcChan should be an unbuffered channel which holds the tablet's next health response.
hcChan chan *querypb.StreamHealthResponse
// errCh is either an unbuffered channel which holds the stream error to return, or nil.
errCh chan error
// cbErrCh is a channel which receives errors returned from the supplied callback.
cbErrCh chan error
mu sync.Mutex
canceled bool
}
// StreamHealth implements queryservice.QueryService.
func (fc *fakeConn) StreamHealth(ctx context.Context, callback func(shr *querypb.StreamHealthResponse) error) error {
if fc.fixedResult != nil {
return callback(fc.fixedResult)
}
for {
select {
case shr := <-fc.hcChan:
@ -696,7 +712,10 @@ func (fc *fakeConn) StreamHealth(ctx context.Context, callback func(shr *querypb
if err == io.EOF {
return nil
}
fc.cbErrCh <- err
select {
case fc.cbErrCh <- err:
case <-ctx.Done():
}
return err
}
case err := <-fc.errCh:

Просмотреть файл

@ -14,55 +14,46 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package vreplication
package discovery
import (
"flag"
"fmt"
"math/rand"
"time"
"vitess.io/vitess/go/vt/vterrors"
"golang.org/x/net/context"
"vitess.io/vitess/go/vt/discovery"
topodatapb "vitess.io/vitess/go/vt/proto/topodata"
"vitess.io/vitess/go/vt/topo"
"vitess.io/vitess/go/vt/topo/topoproto"
topodatapb "vitess.io/vitess/go/vt/proto/topodata"
"vitess.io/vitess/go/vt/vterrors"
)
var (
healthCheckTopologyRefresh = flag.Duration("vreplication_healthcheck_topology_refresh", 30*time.Second, "refresh interval for re-reading the topology")
healthcheckRetryDelay = flag.Duration("vreplication_healthcheck_retry_delay", 5*time.Second, "delay before retrying a failed healthcheck")
healthCheckTimeout = flag.Duration("vreplication_healthcheck_timeout", time.Minute, "the health check timeout period")
)
type tabletPicker struct {
// TabletPicker gives a simplified API for picking tablets.
type TabletPicker struct {
ts *topo.Server
cell string
keyspace string
shard string
tabletTypes []topodatapb.TabletType
healthCheck discovery.HealthCheck
watcher *discovery.TopologyWatcher
statsCache *discovery.TabletStatsCache
healthCheck HealthCheck
watcher *TopologyWatcher
statsCache *TabletStatsCache
}
func newTabletPicker(ctx context.Context, ts *topo.Server, cell, keyspace, shard, tabletTypesStr string) (*tabletPicker, error) {
// NewTabletPicker returns a TabletPicker.
func NewTabletPicker(ctx context.Context, ts *topo.Server, cell, keyspace, shard, tabletTypesStr string, healthcheckTopologyRefresh, healthcheckRetryDelay, healthcheckTimeout time.Duration) (*TabletPicker, error) {
tabletTypes, err := topoproto.ParseTabletTypes(tabletTypesStr)
if err != nil {
return nil, fmt.Errorf("failed to parse list of tablet types: %v", tabletTypesStr)
}
// These have to be initialized in the following sequence (watcher must be last).
healthCheck := discovery.NewHealthCheck(*healthcheckRetryDelay, *healthCheckTimeout)
statsCache := discovery.NewTabletStatsCache(healthCheck, ts, cell)
watcher := discovery.NewShardReplicationWatcher(ctx, ts, healthCheck, cell, keyspace, shard, *healthCheckTopologyRefresh, discovery.DefaultTopoReadConcurrency)
healthCheck := NewHealthCheck(healthcheckRetryDelay, healthcheckTimeout)
statsCache := NewTabletStatsCache(healthCheck, ts, cell)
watcher := NewShardReplicationWatcher(ctx, ts, healthCheck, cell, keyspace, shard, healthcheckTopologyRefresh, DefaultTopoReadConcurrency)
return &tabletPicker{
return &TabletPicker{
ts: ts,
cell: cell,
keyspace: keyspace,
@ -74,27 +65,28 @@ func newTabletPicker(ctx context.Context, ts *topo.Server, cell, keyspace, shard
}, nil
}
func (tp *tabletPicker) Pick(ctx context.Context) (*topodatapb.Tablet, error) {
// PickForStreaming picks all healthy tablets including the non-serving ones.
func (tp *TabletPicker) PickForStreaming(ctx context.Context) (*topodatapb.Tablet, error) {
// wait for any of required the tablets (useful for the first run at least, fast for next runs)
if err := tp.statsCache.WaitForAnyTablet(ctx, tp.cell, tp.keyspace, tp.shard, tp.tabletTypes); err != nil {
if err := tp.statsCache.WaitByFilter(ctx, tp.keyspace, tp.shard, tp.tabletTypes, RemoveUnhealthyTablets); err != nil {
return nil, vterrors.Wrapf(err, "error waiting for tablets for %v %v %v", tp.cell, tp.keyspace, tp.shard)
}
// Find the server list from the health check.
// Note: We cannot use statsCache.GetHealthyTabletStats() here because it does
// not return non-serving tablets. We must include non-serving tablets because
// some tablets may not be serving if their traffic was already migrated to the
// destination shards.
// Refilter the tablets list based on the same criteria.
var addrs []TabletStats
for _, tabletType := range tp.tabletTypes {
addrs := discovery.RemoveUnhealthyTablets(tp.statsCache.GetTabletStats(tp.keyspace, tp.shard, tabletType))
if len(addrs) > 0 {
return addrs[rand.Intn(len(addrs))].Tablet, nil
}
list := RemoveUnhealthyTablets(tp.statsCache.GetTabletStats(tp.keyspace, tp.shard, tabletType))
addrs = append(addrs, list...)
}
if len(addrs) > 0 {
return addrs[rand.Intn(len(addrs))].Tablet, nil
}
// Unreachable.
return nil, fmt.Errorf("can't find any healthy source tablet for %v %v %v", tp.keyspace, tp.shard, tp.tabletTypes)
}
func (tp *tabletPicker) Close() {
// Close shuts down TabletPicker.
func (tp *TabletPicker) Close() {
tp.watcher.Stop()
tp.healthCheck.Close()
}

Просмотреть файл

@ -0,0 +1,175 @@
/*
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 discovery
import (
"testing"
"time"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/net/context"
querypb "vitess.io/vitess/go/vt/proto/query"
topodatapb "vitess.io/vitess/go/vt/proto/topodata"
"vitess.io/vitess/go/vt/topo"
"vitess.io/vitess/go/vt/topo/memorytopo"
)
func TestPickSimple(t *testing.T) {
te := newPickerTestEnv(t)
want := addTablet(te, 100, topodatapb.TabletType_REPLICA, true, true)
defer deleteTablet(te, want)
tp, err := NewTabletPicker(context.Background(), te.topoServ, te.cell, te.keyspace, te.shard, "replica", 1*time.Second, 1*time.Second, 1*time.Minute)
require.NoError(t, err)
defer tp.Close()
tablet, err := tp.PickForStreaming(context.Background())
require.NoError(t, err)
if !proto.Equal(want, tablet) {
t.Errorf("Pick: %v, want %v", tablet, want)
}
}
func TestPickFromTwoHealthy(t *testing.T) {
te := newPickerTestEnv(t)
want1 := addTablet(te, 100, topodatapb.TabletType_REPLICA, true, true)
defer deleteTablet(te, want1)
want2 := addTablet(te, 101, topodatapb.TabletType_RDONLY, true, true)
defer deleteTablet(te, want2)
tp, err := NewTabletPicker(context.Background(), te.topoServ, te.cell, te.keyspace, te.shard, "replica,rdonly", 1*time.Second, 1*time.Second, 1*time.Minute)
require.NoError(t, err)
defer tp.Close()
// In 20 attempts, both tablet types must be picked at least once.
var picked1, picked2 bool
for i := 0; i < 20; i++ {
tablet, err := tp.PickForStreaming(context.Background())
require.NoError(t, err)
if proto.Equal(tablet, want1) {
picked1 = true
}
if proto.Equal(tablet, want2) {
picked2 = true
}
}
assert.True(t, picked1)
assert.True(t, picked2)
}
func TestPickFromSomeUnhealthy(t *testing.T) {
te := newPickerTestEnv(t)
defer deleteTablet(te, addTablet(te, 100, topodatapb.TabletType_REPLICA, false, false))
want := addTablet(te, 101, topodatapb.TabletType_RDONLY, false, true)
defer deleteTablet(te, want)
tp, err := NewTabletPicker(context.Background(), te.topoServ, te.cell, te.keyspace, te.shard, "replica,rdonly", 1*time.Second, 1*time.Second, 1*time.Minute)
require.NoError(t, err)
defer tp.Close()
tablet, err := tp.PickForStreaming(context.Background())
require.NoError(t, err)
if !proto.Equal(tablet, want) {
t.Errorf("Pick:\n%v, want\n%v", tablet, want)
}
}
func TestPickError(t *testing.T) {
te := newPickerTestEnv(t)
defer deleteTablet(te, addTablet(te, 100, topodatapb.TabletType_REPLICA, false, false))
_, err := NewTabletPicker(context.Background(), te.topoServ, te.cell, te.keyspace, te.shard, "badtype", 1*time.Second, 1*time.Second, 1*time.Minute)
assert.EqualError(t, err, "failed to parse list of tablet types: badtype")
tp, err := NewTabletPicker(context.Background(), te.topoServ, te.cell, te.keyspace, te.shard, "replica,rdonly", 1*time.Second, 1*time.Second, 1*time.Minute)
require.NoError(t, err)
defer tp.Close()
ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
defer cancel()
_, err = tp.PickForStreaming(ctx)
require.Error(t, err)
assert.Contains(t, err.Error(), "error waiting for tablets")
}
type pickerTestEnv struct {
t *testing.T
keyspace string
shard string
cell string
topoServ *topo.Server
}
func newPickerTestEnv(t *testing.T) *pickerTestEnv {
ctx := context.Background()
te := &pickerTestEnv{
t: t,
keyspace: "ks",
shard: "0",
cell: "cell",
topoServ: memorytopo.NewServer("cell"),
}
err := te.topoServ.CreateKeyspace(ctx, te.keyspace, &topodatapb.Keyspace{})
require.NoError(t, err)
err = te.topoServ.CreateShard(ctx, te.keyspace, te.shard)
require.NoError(t, err)
return te
}
func addTablet(te *pickerTestEnv, id int, tabletType topodatapb.TabletType, serving, healthy bool) *topodatapb.Tablet {
tablet := &topodatapb.Tablet{
Alias: &topodatapb.TabletAlias{
Cell: te.cell,
Uid: uint32(id),
},
Keyspace: te.keyspace,
Shard: te.shard,
KeyRange: &topodatapb.KeyRange{},
Type: tabletType,
PortMap: map[string]int32{
"test": int32(id),
},
}
err := te.topoServ.CreateTablet(context.Background(), tablet)
require.NoError(te.t, err)
var herr string
if !healthy {
herr = "err"
}
_ = createFixedHealthConn(tablet, &querypb.StreamHealthResponse{
Serving: serving,
Target: &querypb.Target{
Keyspace: te.keyspace,
Shard: te.shard,
TabletType: tabletType,
},
RealtimeStats: &querypb.RealtimeStats{HealthError: herr},
})
return tablet
}
func deleteTablet(te *pickerTestEnv, tablet *topodatapb.Tablet) {
te.topoServ.DeleteTablet(context.Background(), tablet.Alias)
// This is not automatically removed from shard replication, which results in log spam.
topo.DeleteTabletReplicationData(context.Background(), te.topoServ, tablet)
}

Просмотреть файл

@ -30,10 +30,10 @@ var (
waitAvailableTabletInterval = 100 * time.Millisecond
)
// WaitForTablets waits for at least one tablet in the given cell /
// WaitForTablets waits for at least one tablet in the given
// keyspace / shard / tablet type before returning. The tablets do not
// have to be healthy. It will return ctx.Err() if the context is canceled.
func (tc *TabletStatsCache) WaitForTablets(ctx context.Context, cell, keyspace, shard string, tabletType topodatapb.TabletType) error {
func (tc *TabletStatsCache) WaitForTablets(ctx context.Context, keyspace, shard string, tabletType topodatapb.TabletType) error {
targets := []*querypb.Target{
{
Keyspace: keyspace,
@ -44,12 +44,6 @@ func (tc *TabletStatsCache) WaitForTablets(ctx context.Context, cell, keyspace,
return tc.waitForTablets(ctx, targets, false)
}
// WaitForAnyTablet waits for a single tablet of any of the types.
// It doesn't have to be serving.
func (tc *TabletStatsCache) WaitForAnyTablet(ctx context.Context, cell, keyspace, shard string, tabletTypes []topodatapb.TabletType) error {
return tc.waitForAnyTablet(ctx, keyspace, shard, tabletTypes)
}
// WaitForAllServingTablets waits for at least one healthy serving tablet in
// each given target before returning.
// It will return ctx.Err() if the context is canceled.
@ -97,11 +91,12 @@ func (tc *TabletStatsCache) waitForTablets(ctx context.Context, targets []*query
}
}
// waitForAnyTablet is the internal method that polls for any tablet of required type
func (tc *TabletStatsCache) waitForAnyTablet(ctx context.Context, keyspace, shard string, types []topodatapb.TabletType) error {
// WaitByFilter waits for at least one tablet based on the filter function.
func (tc *TabletStatsCache) WaitByFilter(ctx context.Context, keyspace, shard string, tabletTypes []topodatapb.TabletType, filter func([]TabletStats) []TabletStats) error {
for {
for _, tt := range types {
for _, tt := range tabletTypes {
stats := tc.GetTabletStats(keyspace, shard, tt)
stats = filter(stats)
if len(stats) > 0 {
return nil
}

Просмотреть файл

@ -43,14 +43,14 @@ func TestWaitForTablets(t *testing.T) {
hc.AddTablet(tablet, "")
// this should time out
if err := tsc.WaitForTablets(shortCtx, "cell", "keyspace", "shard", topodatapb.TabletType_REPLICA); err != context.DeadlineExceeded {
if err := tsc.WaitForTablets(shortCtx, "keyspace", "shard", topodatapb.TabletType_REPLICA); err != context.DeadlineExceeded {
t.Errorf("got wrong error: %v", err)
}
// this should fail, but return a non-timeout error
cancelledCtx, cancel := context.WithCancel(context.Background())
cancel()
if err := tsc.WaitForTablets(cancelledCtx, "cell", "keyspace", "shard", topodatapb.TabletType_REPLICA); err == nil || err == context.DeadlineExceeded {
if err := tsc.WaitForTablets(cancelledCtx, "keyspace", "shard", topodatapb.TabletType_REPLICA); err == nil || err == context.DeadlineExceeded {
t.Errorf("want: non-timeout error, got: %v", err)
}
@ -70,7 +70,7 @@ func TestWaitForTablets(t *testing.T) {
longCtx, longCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer longCancel()
waitAvailableTabletInterval = 10 * time.Millisecond
if err := tsc.WaitForTablets(longCtx, "cell", "keyspace", "shard", topodatapb.TabletType_REPLICA); err != nil {
if err := tsc.WaitForTablets(longCtx, "keyspace", "shard", topodatapb.TabletType_REPLICA); err != nil {
t.Errorf("got error: %v", err)
}
}

Просмотреть файл

@ -21,8 +21,8 @@ package grpcclient
import (
"flag"
"github.com/grpc-ecosystem/go-grpc-middleware"
"github.com/grpc-ecosystem/go-grpc-prometheus"
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/keepalive"

Просмотреть файл

@ -77,7 +77,7 @@ func TestFindFilesToBackup(t *testing.T) {
DataDir: dataDir,
}
result, err := findFilesToBackup(cnf)
result, totalSize, err := findFilesToBackup(cnf)
if err != nil {
t.Fatalf("findFilesToBackup failed: %v", err)
}
@ -112,6 +112,9 @@ func TestFindFilesToBackup(t *testing.T) {
if !reflect.DeepEqual(result, expected) {
t.Fatalf("got wrong list of FileEntry %v, expected %v", result, expected)
}
if totalSize <= 0 {
t.Fatalf("backup size should be > 0, got %v", totalSize)
}
}
type forTest []FileEntry

Просмотреть файл

@ -21,8 +21,11 @@ import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
"time"
"vitess.io/vitess/go/mysql"
@ -291,3 +294,119 @@ func RestoreWasInterrupted(cnf *Mycnf) bool {
func GetBackupDir(keyspace, shard string) string {
return fmt.Sprintf("%v/%v", keyspace, shard)
}
// 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, int64, error) {
p := path.Join(baseDir, subDir)
var size int64
fis, err := ioutil.ReadDir(p)
if err != nil {
return nil, 0, err
}
for _, fi := range fis {
fes = append(fes, FileEntry{
Base: base,
Name: path.Join(subDir, fi.Name()),
})
size = size + fi.Size()
}
return fes, size, 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, int64, error) {
filePath := path.Join(baseDir, dataDictionaryFile)
// no-op if this file doesn't exist
fi, err := os.Stat(filePath)
if os.IsNotExist(err) {
return fes, 0, nil
}
fes = append(fes, FileEntry{
Base: base,
Name: dataDictionaryFile,
})
return fes, fi.Size(), nil
}
func findFilesToBackup(cnf *Mycnf) ([]FileEntry, int64, error) {
var err error
var result []FileEntry
var totalSize int64
// first add inno db files
result, totalSize, err = addDirectory(result, backupInnodbDataHomeDir, cnf.InnodbDataHomeDir, "")
if err != nil {
return nil, 0, err
}
result, size, err := addDirectory(result, backupInnodbLogGroupHomeDir, cnf.InnodbLogGroupHomeDir, "")
if err != nil {
return nil, 0, err
}
totalSize = totalSize + size
// then add the transactional data dictionary if it exists
result, size, err = addMySQL8DataDictionary(result, backupData, cnf.DataDir)
if err != nil {
return nil, 0, err
}
totalSize = totalSize + size
// then add DB directories
fis, err := ioutil.ReadDir(cnf.DataDir)
if err != nil {
return nil, 0, err
}
for _, fi := range fis {
p := path.Join(cnf.DataDir, fi.Name())
if isDbDir(p) {
result, size, err = addDirectory(result, backupData, cnf.DataDir, fi.Name())
if err != nil {
return nil, 0, err
}
totalSize = totalSize + size
}
}
return result, totalSize, nil
}

Просмотреть файл

@ -49,6 +49,8 @@ type BackupHandle interface {
// multiple go routines once a backup has been started.
// The context is valid for the duration of the writes, until the
// WriteCloser is closed.
// filesize should not be treated as an exact value but rather
// as an approximate value
AddFile(ctx context.Context, filename string, filesize int64) (io.WriteCloser, error)
// EndBackup stops and closes a backup. The contents should be kept.

Просмотреть файл

@ -22,10 +22,8 @@ import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"path"
"strings"
"sync"
"time"
@ -126,116 +124,6 @@ func (fe *FileEntry) open(cnf *Mycnf, readOnly bool) (*os.File, error) {
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) {
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, params BackupParams, bh backupstorage.BackupHandle) (bool, error) {
@ -379,7 +267,8 @@ func (be *BuiltinBackupEngine) ExecuteBackup(ctx context.Context, params BackupP
func (be *BuiltinBackupEngine) backupFiles(ctx context.Context, params BackupParams, bh backupstorage.BackupHandle, replicationPosition mysql.Position) (finalErr error) {
// Get the files to backup.
fes, err := findFilesToBackup(params.Cnf)
// We don't care about totalSize because we add each file separately.
fes, _, err := findFilesToBackup(params.Cnf)
if err != nil {
return vterrors.Wrap(err, "can't find files to backup")
}

Просмотреть файл

@ -33,6 +33,7 @@ import (
"vitess.io/vitess/go/vt/mysqlctl"
"vitess.io/vitess/go/vt/mysqlctl/tmutils"
querypb "vitess.io/vitess/go/vt/proto/query"
tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata"
)
@ -304,7 +305,7 @@ func (fmd *FakeMysqlDaemon) WaitForReparentJournal(ctx context.Context, timeCrea
return nil
}
// Deprecated: use mysqld.MasterPosition() instead
// DemoteMaster is deprecated: use mysqld.MasterPosition() instead
func (fmd *FakeMysqlDaemon) DemoteMaster() (mysql.Position, error) {
return fmd.CurrentMasterPosition, nil
}
@ -412,8 +413,8 @@ func (fmd *FakeMysqlDaemon) GetSchema(dbName string, tables, excludeTables []str
}
// GetColumns is part of the MysqlDaemon interface
func (fmd *FakeMysqlDaemon) GetColumns(dbName, table string) ([]string, error) {
return []string{}, nil
func (fmd *FakeMysqlDaemon) GetColumns(dbName, table string) ([]*querypb.Field, []string, error) {
return []*querypb.Field{}, []string{}, nil
}
// GetPrimaryKeyColumns is part of the MysqlDaemon interface

Просмотреть файл

@ -20,18 +20,9 @@ import (
"encoding/hex"
"hash"
"hash/crc32"
"os"
)
// Use this to simulate failures in tests
var (
simulateFailures = false
)
func init() {
_, statErr := os.Stat("/tmp/vtSimulateFetchFailures")
simulateFailures = statErr == nil
}
// TODO(sougou): this file should be renamed.
// our hasher, implemented using crc32
type hasher struct {

Просмотреть файл

@ -30,7 +30,7 @@ import (
const (
sqlCreateLocalMetadataTable = `CREATE TABLE IF NOT EXISTS _vt.local_metadata (
name VARCHAR(255) NOT NULL,
value VARCHAR(255) NOT NULL,
value MEDIUMBLOB NOT NULL,
PRIMARY KEY (name)
) ENGINE=InnoDB`
sqlCreateShardMetadataTable = `CREATE TABLE IF NOT EXISTS _vt.shard_metadata (
@ -46,6 +46,9 @@ var (
sqlAlterLocalMetadataTable = []string{
`ALTER TABLE _vt.local_metadata ADD COLUMN db_name VARBINARY(255) NOT NULL DEFAULT ''`,
`ALTER TABLE _vt.local_metadata DROP PRIMARY KEY, ADD PRIMARY KEY(name, db_name)`,
// VARCHAR(255) is not long enough to hold replication positions, hence changing to
// MEDIUMBLOB.
`ALTER TABLE _vt.local_metadata CHANGE value value MEDIUMBLOB NOT NULL`,
}
sqlAlterShardMetadataTable = []string{
`ALTER TABLE _vt.shard_metadata ADD COLUMN db_name VARBINARY(255) NOT NULL DEFAULT ''`,

Просмотреть файл

@ -24,6 +24,7 @@ import (
"vitess.io/vitess/go/vt/dbconnpool"
"vitess.io/vitess/go/vt/mysqlctl/tmutils"
querypb "vitess.io/vitess/go/vt/proto/query"
tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata"
)
@ -69,7 +70,7 @@ type MysqlDaemon interface {
// Schema related methods
GetSchema(dbName string, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error)
GetColumns(dbName, table string) ([]string, error)
GetColumns(dbName, table string) ([]*querypb.Field, []string, error)
GetPrimaryKeyColumns(dbName, table string) ([]string, error)
PreflightSchemaChange(dbName string, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error)
ApplySchemaChange(dbName string, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error)

Просмотреть файл

@ -83,6 +83,9 @@ var (
versionRegex = regexp.MustCompile(`Ver ([0-9]+)\.([0-9]+)\.([0-9]+)`)
)
// How many bytes from MySQL error log to sample for error messages
const maxLogFileSampleSize = 4096
// Mysqld is the object that represents a mysqld daemon running on this server.
type Mysqld struct {
dbcfgs *dbconfigs.DBConfigs
@ -647,7 +650,7 @@ func (mysqld *Mysqld) Init(ctx context.Context, cnf *Mycnf, initDBSQLFile string
// Start mysqld. We do not use Start, as we have to wait using
// the root user.
if err = mysqld.startNoWait(ctx, cnf); err != nil {
log.Errorf("failed starting mysqld (check mysql error log %v for more info): %v", cnf.ErrorLogPath, err)
log.Errorf("failed starting mysqld: %v\n%v", err, readTailOfMysqldErrorLog(cnf.ErrorLogPath))
return err
}
@ -659,7 +662,7 @@ func (mysqld *Mysqld) Init(ctx context.Context, cnf *Mycnf, initDBSQLFile string
UnixSocket: cnf.SocketFile,
}
if err = mysqld.wait(ctx, cnf, params); err != nil {
log.Errorf("failed starting mysqld in time (check mysyql error log %v for more info): %v", cnf.ErrorLogPath, err)
log.Errorf("failed starting mysqld in time: %v\n%v", err, readTailOfMysqldErrorLog(cnf.ErrorLogPath))
return err
}
@ -676,6 +679,36 @@ func (mysqld *Mysqld) Init(ctx context.Context, cnf *Mycnf, initDBSQLFile string
return nil
}
// For debugging purposes show the last few lines of the MySQL error log.
// Return a suggestion (string) if the file is non regular or can not be opened.
// This helps prevent cases where the error log is symlinked to /dev/stderr etc,
// In which case the user can manually open the file.
func readTailOfMysqldErrorLog(fileName string) string {
fileInfo, err := os.Stat(fileName)
if err != nil {
return fmt.Sprintf("could not stat mysql error log (%v): %v", fileName, err)
}
if !fileInfo.Mode().IsRegular() {
return fmt.Sprintf("mysql error log file is not a regular file: %v", fileName)
}
file, err := os.Open(fileName)
if err != nil {
return fmt.Sprintf("could not open mysql error log (%v): %v", fileName, err)
}
defer file.Close()
startPos := int64(0)
if fileInfo.Size() > maxLogFileSampleSize {
startPos = fileInfo.Size() - maxLogFileSampleSize
}
// Show the last few KB of the MySQL error log.
buf := make([]byte, maxLogFileSampleSize)
flen, err := file.ReadAt(buf, startPos)
if err != nil && err != io.EOF {
return fmt.Sprintf("could not read mysql error log (%v): %v", fileName, err)
}
return fmt.Sprintf("tail of mysql error log (%v):\n%s", fileName, buf[:flen])
}
func (mysqld *Mysqld) installDataDir(cnf *Mycnf) error {
mysqlRoot, err := vtenv.VtMysqlRoot()
if err != nil {
@ -698,7 +731,7 @@ func (mysqld *Mysqld) installDataDir(cnf *Mycnf) error {
"--initialize-insecure", // Use empty 'root'@'localhost' password.
}
if _, _, err = execCmd(mysqldPath, args, nil, mysqlRoot, nil); err != nil {
log.Errorf("mysqld --initialize-insecure failed: %v", err)
log.Errorf("mysqld --initialize-insecure failed: %v\n%v", err, readTailOfMysqldErrorLog(cnf.ErrorLogPath))
return err
}
return nil
@ -714,7 +747,7 @@ func (mysqld *Mysqld) installDataDir(cnf *Mycnf) error {
return err
}
if _, _, err = execCmd(cmdPath, args, nil, mysqlRoot, nil); err != nil {
log.Errorf("mysql_install_db failed: %v", err)
log.Errorf("mysql_install_db failed: %v\n%v", err, readTailOfMysqldErrorLog(cnf.ErrorLogPath))
return err
}
return nil
@ -771,8 +804,7 @@ func (mysqld *Mysqld) getMycnfTemplates(root string) []string {
cnfTemplatePaths = append(cnfTemplatePaths, parts...)
}
// Only include these files if they exist.
// master_{flavor}.cnf
// Only include files if they exist.
// Percona Server == MySQL in this context
f := flavorMariaDB
@ -780,15 +812,9 @@ func (mysqld *Mysqld) getMycnfTemplates(root string) []string {
f = flavorMySQL
}
p := path.Join(root, fmt.Sprintf("config/mycnf/master_%s.cnf", f))
_, err := os.Stat(p)
if err == nil && !contains(cnfTemplatePaths, p) {
cnfTemplatePaths = append(cnfTemplatePaths, p)
}
// master_{flavor}{major}{minor}.cnf
p = path.Join(root, fmt.Sprintf("config/mycnf/master_%s%d%d.cnf", f, mysqld.capabilities.version.Major, mysqld.capabilities.version.Minor))
_, err = os.Stat(p)
p := path.Join(root, fmt.Sprintf("config/mycnf/master_%s%d%d.cnf", f, mysqld.capabilities.version.Major, mysqld.capabilities.version.Minor))
_, err := os.Stat(p)
if err == nil && !contains(cnfTemplatePaths, p) {
cnfTemplatePaths = append(cnfTemplatePaths, p)
}

Просмотреть файл

@ -181,6 +181,17 @@ func (mysqld *Mysqld) WaitMasterPos(ctx context.Context, targetPos mysql.Positio
}
defer conn.Recycle()
// If we are the master, WaitUntilPositionCommand will fail.
// But position is most likely reached. So, check the position
// first.
mpos, err := conn.MasterPosition()
if err != nil {
return fmt.Errorf("WaitMasterPos: MasterPosition failed: %v", err)
}
if mpos.AtLeast(targetPos) {
return nil
}
// Find the query to run, run it.
query, err := conn.WaitUntilPositionCommand(ctx, targetPos)
if err != nil {

Просмотреть файл

@ -29,6 +29,7 @@ import (
"vitess.io/vitess/go/vt/log"
"vitess.io/vitess/go/vt/mysqlctl/tmutils"
querypb "vitess.io/vitess/go/vt/proto/query"
tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata"
)
@ -122,7 +123,7 @@ func (mysqld *Mysqld) GetSchema(dbName string, tables, excludeTables []string, i
td.Name = tableName
td.Schema = norm
td.Columns, err = mysqld.GetColumns(dbName, tableName)
td.Fields, td.Columns, err = mysqld.GetColumns(dbName, tableName)
if err != nil {
return nil, err
}
@ -159,21 +160,21 @@ func ResolveTables(mysqld MysqlDaemon, dbName string, tables []string) ([]string
}
// GetColumns returns the columns of table.
func (mysqld *Mysqld) GetColumns(dbName, table string) ([]string, error) {
func (mysqld *Mysqld) GetColumns(dbName, table string) ([]*querypb.Field, []string, error) {
conn, err := getPoolReconnect(context.TODO(), mysqld.dbaPool)
if err != nil {
return nil, err
return nil, nil, err
}
defer conn.Recycle()
qr, err := conn.ExecuteFetch(fmt.Sprintf("SELECT * FROM %s.%s WHERE 1=0", sqlescape.EscapeID(dbName), sqlescape.EscapeID(table)), 0, true)
if err != nil {
return nil, err
return nil, nil, err
}
columns := make([]string, len(qr.Fields))
for i, field := range qr.Fields {
columns[i] = field.Name
}
return columns, nil
return qr.Fields, columns, nil
}

Просмотреть файл

@ -78,8 +78,8 @@ func FilterTables(sd *tabletmanagerdatapb.SchemaDefinition, tables, excludeTable
if len(tables) > 0 {
tableRegexps = make([]*regexp.Regexp, len(tables))
for i, table := range tables {
if len(table) > 2 && strings.HasPrefix(table, "/") && strings.HasSuffix(table, "/") {
table = table[1 : len(table)-1]
if strings.HasPrefix(table, "/") {
table = strings.Trim(table, "/")
var err error
tableRegexps[i], err = regexp.Compile(table)
if err != nil {
@ -92,8 +92,8 @@ func FilterTables(sd *tabletmanagerdatapb.SchemaDefinition, tables, excludeTable
if len(excludeTables) > 0 {
excludeTableRegexps = make([]*regexp.Regexp, len(excludeTables))
for i, table := range excludeTables {
if len(table) > 2 && strings.HasPrefix(table, "/") && strings.HasSuffix(table, "/") {
table = table[1 : len(table)-1]
if strings.HasPrefix(table, "/") {
table = strings.Trim(table, "/")
var err error
excludeTableRegexps[i], err = regexp.Compile(table)
if err != nil {

Просмотреть файл

@ -221,7 +221,7 @@ func (be *XtrabackupEngine) backupFiles(ctx context.Context, params BackupParams
// a timeout on the final Close() step.
addFilesCtx, cancelAddFiles := context.WithCancel(ctx)
defer cancelAddFiles()
destFiles, err := addStripeFiles(addFilesCtx, bh, backupFileName, numStripes, params.Logger)
destFiles, err := addStripeFiles(addFilesCtx, params, bh, backupFileName, numStripes)
if err != nil {
return replicationPosition, vterrors.Wrapf(err, "cannot create backup file %v", backupFileName)
}
@ -402,6 +402,13 @@ func (be *XtrabackupEngine) restoreFromBackup(ctx context.Context, cnf *Mycnf, b
if err := os.MkdirAll(tempDir, os.ModePerm); err != nil {
return err
}
// delete tempDir once we are done
defer func(dir string, l logutil.Logger) {
err := os.RemoveAll(dir)
if err != nil {
l.Errorf("error deleting tempDir(%v): %v", dir, err)
}
}(tempDir, logger)
if err := be.extractFiles(ctx, logger, bh, bm, tempDir); err != nil {
logger.Errorf("error extracting backup files: %v", err)
@ -647,23 +654,35 @@ func stripeFileName(baseFileName string, index int) string {
return fmt.Sprintf("%s-%03d", baseFileName, index)
}
func addStripeFiles(ctx context.Context, backupHandle backupstorage.BackupHandle, baseFileName string, numStripes int, logger logutil.Logger) ([]io.WriteCloser, error) {
func addStripeFiles(ctx context.Context, params BackupParams, backupHandle backupstorage.BackupHandle, baseFileName string, numStripes int) ([]io.WriteCloser, error) {
// Compute total size of all files we will backup.
// We delegate the actual backing up to xtrabackup which streams
// the files as a single archive (tar / xbstream), which might
// further be compressed using gzip.
// This approximate total size is passed in to AddFile so that
// storage plugins can make appropriate choices for parameters
// like partSize in multi-part uploads
_, totalSize, err := findFilesToBackup(params.Cnf)
if err != nil {
return nil, err
}
if numStripes <= 1 {
// No striping.
file, err := backupHandle.AddFile(ctx, baseFileName, 0)
file, err := backupHandle.AddFile(ctx, baseFileName, totalSize)
return []io.WriteCloser{file}, err
}
files := []io.WriteCloser{}
for i := 0; i < numStripes; i++ {
filename := stripeFileName(baseFileName, i)
logger.Infof("Opening backup stripe file %v", filename)
file, err := backupHandle.AddFile(ctx, filename, 0)
params.Logger.Infof("Opening backup stripe file %v", filename)
file, err := backupHandle.AddFile(ctx, filename, totalSize/int64(numStripes))
if err != nil {
// Close any files we already opened and clear them from the result.
for _, file := range files {
if err := file.Close(); err != nil {
logger.Warningf("error closing backup stripe file: %v", err)
params.Logger.Warningf("error closing backup stripe file: %v", err)
}
}
return nil, err

Просмотреть файл

@ -5,8 +5,9 @@ package automation
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -6,11 +6,12 @@ package automationservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
automation "vitess.io/vitess/go/vt/proto/automation"
)

Просмотреть файл

@ -5,8 +5,9 @@ package binlogdata
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
query "vitess.io/vitess/go/vt/proto/query"
topodata "vitess.io/vitess/go/vt/proto/topodata"
vtrpc "vitess.io/vitess/go/vt/proto/vtrpc"
@ -1527,6 +1528,128 @@ func (m *VStreamRowsResponse) GetLastpk() *query.Row {
return nil
}
// VStreamResultsRequest is the payload for VStreamResults
// The ids match VStreamRows, in case we decide to merge the two.
type VStreamResultsRequest struct {
EffectiveCallerId *vtrpc.CallerID `protobuf:"bytes,1,opt,name=effective_caller_id,json=effectiveCallerId,proto3" json:"effective_caller_id,omitempty"`
ImmediateCallerId *query.VTGateCallerID `protobuf:"bytes,2,opt,name=immediate_caller_id,json=immediateCallerId,proto3" json:"immediate_caller_id,omitempty"`
Target *query.Target `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"`
Query string `protobuf:"bytes,4,opt,name=query,proto3" json:"query,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VStreamResultsRequest) Reset() { *m = VStreamResultsRequest{} }
func (m *VStreamResultsRequest) String() string { return proto.CompactTextString(m) }
func (*VStreamResultsRequest) ProtoMessage() {}
func (*VStreamResultsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_5fd02bcb2e350dad, []int{21}
}
func (m *VStreamResultsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VStreamResultsRequest.Unmarshal(m, b)
}
func (m *VStreamResultsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VStreamResultsRequest.Marshal(b, m, deterministic)
}
func (m *VStreamResultsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_VStreamResultsRequest.Merge(m, src)
}
func (m *VStreamResultsRequest) XXX_Size() int {
return xxx_messageInfo_VStreamResultsRequest.Size(m)
}
func (m *VStreamResultsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_VStreamResultsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_VStreamResultsRequest proto.InternalMessageInfo
func (m *VStreamResultsRequest) GetEffectiveCallerId() *vtrpc.CallerID {
if m != nil {
return m.EffectiveCallerId
}
return nil
}
func (m *VStreamResultsRequest) GetImmediateCallerId() *query.VTGateCallerID {
if m != nil {
return m.ImmediateCallerId
}
return nil
}
func (m *VStreamResultsRequest) GetTarget() *query.Target {
if m != nil {
return m.Target
}
return nil
}
func (m *VStreamResultsRequest) GetQuery() string {
if m != nil {
return m.Query
}
return ""
}
// VStreamResultsResponse is the response from VStreamResults
// The ids match VStreamRows, in case we decide to merge the two.
type VStreamResultsResponse struct {
Fields []*query.Field `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"`
Gtid string `protobuf:"bytes,3,opt,name=gtid,proto3" json:"gtid,omitempty"`
Rows []*query.Row `protobuf:"bytes,4,rep,name=rows,proto3" json:"rows,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *VStreamResultsResponse) Reset() { *m = VStreamResultsResponse{} }
func (m *VStreamResultsResponse) String() string { return proto.CompactTextString(m) }
func (*VStreamResultsResponse) ProtoMessage() {}
func (*VStreamResultsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_5fd02bcb2e350dad, []int{22}
}
func (m *VStreamResultsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VStreamResultsResponse.Unmarshal(m, b)
}
func (m *VStreamResultsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_VStreamResultsResponse.Marshal(b, m, deterministic)
}
func (m *VStreamResultsResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_VStreamResultsResponse.Merge(m, src)
}
func (m *VStreamResultsResponse) XXX_Size() int {
return xxx_messageInfo_VStreamResultsResponse.Size(m)
}
func (m *VStreamResultsResponse) XXX_DiscardUnknown() {
xxx_messageInfo_VStreamResultsResponse.DiscardUnknown(m)
}
var xxx_messageInfo_VStreamResultsResponse proto.InternalMessageInfo
func (m *VStreamResultsResponse) GetFields() []*query.Field {
if m != nil {
return m.Fields
}
return nil
}
func (m *VStreamResultsResponse) GetGtid() string {
if m != nil {
return m.Gtid
}
return ""
}
func (m *VStreamResultsResponse) GetRows() []*query.Row {
if m != nil {
return m.Rows
}
return nil
}
func init() {
proto.RegisterEnum("binlogdata.OnDDLAction", OnDDLAction_name, OnDDLAction_value)
proto.RegisterEnum("binlogdata.VEventType", VEventType_name, VEventType_value)
@ -1555,112 +1678,115 @@ func init() {
proto.RegisterType((*VStreamResponse)(nil), "binlogdata.VStreamResponse")
proto.RegisterType((*VStreamRowsRequest)(nil), "binlogdata.VStreamRowsRequest")
proto.RegisterType((*VStreamRowsResponse)(nil), "binlogdata.VStreamRowsResponse")
proto.RegisterType((*VStreamResultsRequest)(nil), "binlogdata.VStreamResultsRequest")
proto.RegisterType((*VStreamResultsResponse)(nil), "binlogdata.VStreamResultsResponse")
}
func init() { proto.RegisterFile("binlogdata.proto", fileDescriptor_5fd02bcb2e350dad) }
var fileDescriptor_5fd02bcb2e350dad = []byte{
// 1625 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x57, 0xcd, 0x72, 0xdb, 0xc8,
0x11, 0x16, 0x49, 0xf0, 0xaf, 0x21, 0x51, 0xd0, 0xe8, 0x27, 0x8c, 0x2a, 0x4e, 0xc9, 0xa8, 0x38,
0x92, 0x55, 0x15, 0x2a, 0x61, 0x12, 0xe7, 0xe4, 0x38, 0xfc, 0x81, 0x24, 0x4a, 0x20, 0x29, 0x0f,
0x21, 0x39, 0xe5, 0x0b, 0x0a, 0x22, 0x87, 0x12, 0x22, 0x10, 0xa0, 0x81, 0xa1, 0x14, 0x3d, 0x40,
0x2a, 0x0f, 0x90, 0x6b, 0x5e, 0x20, 0xe7, 0x5c, 0x93, 0xeb, 0xde, 0xf7, 0x09, 0xf6, 0xb4, 0xef,
0xb1, 0x35, 0x3f, 0x00, 0x09, 0xc9, 0x6b, 0xcb, 0x5b, 0xb5, 0x87, 0xbd, 0xa0, 0x7a, 0x7a, 0xba,
0x7b, 0x7a, 0xbe, 0xf9, 0x7a, 0x1a, 0x03, 0xda, 0xa5, 0xeb, 0x7b, 0xc1, 0xd5, 0xc8, 0xa1, 0x4e,
0x6d, 0x1a, 0x06, 0x34, 0x40, 0x30, 0xd7, 0x6c, 0xab, 0xb7, 0x34, 0x9c, 0x0e, 0xc5, 0xc4, 0xb6,
0xfa, 0x61, 0x46, 0xc2, 0x7b, 0x39, 0xa8, 0xd0, 0x60, 0x1a, 0xcc, 0xbd, 0xf4, 0x2e, 0x14, 0x5b,
0xd7, 0x4e, 0x18, 0x11, 0x8a, 0xb6, 0xa0, 0x30, 0xf4, 0x5c, 0xe2, 0xd3, 0x6a, 0x66, 0x27, 0xb3,
0x97, 0xc7, 0x72, 0x84, 0x10, 0x28, 0xc3, 0xc0, 0xf7, 0xab, 0x59, 0xae, 0xe5, 0x32, 0xb3, 0x8d,
0x48, 0x78, 0x4b, 0xc2, 0x6a, 0x4e, 0xd8, 0x8a, 0x91, 0xfe, 0x6d, 0x0e, 0xd6, 0x9a, 0x3c, 0x0f,
0x2b, 0x74, 0xfc, 0xc8, 0x19, 0x52, 0x37, 0xf0, 0xd1, 0x11, 0x40, 0x44, 0x1d, 0x4a, 0x26, 0xc4,
0xa7, 0x51, 0x35, 0xb3, 0x93, 0xdb, 0x53, 0xeb, 0xbb, 0xb5, 0x85, 0x1d, 0x3c, 0x72, 0xa9, 0x0d,
0x62, 0x7b, 0xbc, 0xe0, 0x8a, 0xea, 0xa0, 0x92, 0x5b, 0xe2, 0x53, 0x9b, 0x06, 0x37, 0xc4, 0xaf,
0x2a, 0x3b, 0x99, 0x3d, 0xb5, 0xbe, 0x56, 0x13, 0x1b, 0x34, 0xd8, 0x8c, 0xc5, 0x26, 0x30, 0x90,
0x44, 0xde, 0xfe, 0x2a, 0x0b, 0xe5, 0x24, 0x1a, 0x32, 0xa1, 0x34, 0x74, 0x28, 0xb9, 0x0a, 0xc2,
0x7b, 0xbe, 0xcd, 0x4a, 0xfd, 0xb7, 0x4f, 0x4c, 0xa4, 0xd6, 0x92, 0x7e, 0x38, 0x89, 0x80, 0x7e,
0x03, 0xc5, 0xa1, 0x40, 0x8f, 0xa3, 0xa3, 0xd6, 0xd7, 0x17, 0x83, 0x49, 0x60, 0x71, 0x6c, 0x83,
0x34, 0xc8, 0x45, 0x1f, 0x3c, 0x0e, 0xd9, 0x32, 0x66, 0xa2, 0xfe, 0x9f, 0x0c, 0x94, 0xe2, 0xb8,
0x68, 0x1d, 0x56, 0x9b, 0xa6, 0x7d, 0xde, 0xc3, 0x46, 0xab, 0x7f, 0xd4, 0xeb, 0xbc, 0x37, 0xda,
0xda, 0x12, 0x5a, 0x86, 0x52, 0xd3, 0xb4, 0x9b, 0xc6, 0x51, 0xa7, 0xa7, 0x65, 0xd0, 0x0a, 0x94,
0x9b, 0xa6, 0xdd, 0xea, 0x77, 0xbb, 0x1d, 0x4b, 0xcb, 0xa2, 0x55, 0x50, 0x9b, 0xa6, 0x8d, 0xfb,
0xa6, 0xd9, 0x6c, 0xb4, 0x4e, 0xb5, 0x1c, 0xda, 0x84, 0xb5, 0xa6, 0x69, 0xb7, 0xbb, 0xa6, 0xdd,
0x36, 0xce, 0xb0, 0xd1, 0x6a, 0x58, 0x46, 0x5b, 0x53, 0x10, 0x40, 0x81, 0xa9, 0xdb, 0xa6, 0x96,
0x97, 0xf2, 0xc0, 0xb0, 0xb4, 0x82, 0x0c, 0xd7, 0xe9, 0x0d, 0x0c, 0x6c, 0x69, 0x45, 0x39, 0x3c,
0x3f, 0x6b, 0x37, 0x2c, 0x43, 0x2b, 0xc9, 0x61, 0xdb, 0x30, 0x0d, 0xcb, 0xd0, 0xca, 0x27, 0x4a,
0x29, 0xab, 0xe5, 0x4e, 0x94, 0x52, 0x4e, 0x53, 0xf4, 0x7f, 0x65, 0x60, 0x73, 0x40, 0x43, 0xe2,
0x4c, 0x4e, 0xc9, 0x3d, 0x76, 0xfc, 0x2b, 0x82, 0xc9, 0x87, 0x19, 0x89, 0x28, 0xda, 0x86, 0xd2,
0x34, 0x88, 0x5c, 0x86, 0x1d, 0x07, 0xb8, 0x8c, 0x93, 0x31, 0x3a, 0x80, 0xf2, 0x0d, 0xb9, 0xb7,
0x43, 0x66, 0x2f, 0x01, 0x43, 0xb5, 0x84, 0x90, 0x49, 0xa4, 0xd2, 0x8d, 0x94, 0x16, 0xf1, 0xcd,
0x7d, 0x1e, 0x5f, 0x7d, 0x0c, 0x5b, 0x0f, 0x93, 0x8a, 0xa6, 0x81, 0x1f, 0x11, 0x64, 0x02, 0x12,
0x8e, 0x36, 0x9d, 0x9f, 0x2d, 0xcf, 0x4f, 0xad, 0x3f, 0xfb, 0x24, 0x01, 0xf0, 0xda, 0xe5, 0x43,
0x95, 0xfe, 0x77, 0x58, 0x17, 0xeb, 0x58, 0xce, 0xa5, 0x47, 0xa2, 0xa7, 0x6c, 0x7d, 0x0b, 0x0a,
0x94, 0x1b, 0x57, 0xb3, 0x3b, 0xb9, 0xbd, 0x32, 0x96, 0xa3, 0x2f, 0xdd, 0xe1, 0x08, 0x36, 0xd2,
0x2b, 0xff, 0x28, 0xfb, 0xfb, 0x03, 0x28, 0x78, 0xe6, 0x11, 0xb4, 0x01, 0xf9, 0x89, 0x43, 0x87,
0xd7, 0x72, 0x37, 0x62, 0xc0, 0xb6, 0x32, 0x76, 0x3d, 0x4a, 0x42, 0x7e, 0x84, 0x65, 0x2c, 0x47,
0xfa, 0x7f, 0x33, 0x50, 0x38, 0xe4, 0x22, 0xfa, 0x35, 0xe4, 0xc3, 0x19, 0xdb, 0xac, 0xa8, 0x75,
0x6d, 0x31, 0x03, 0x16, 0x19, 0x8b, 0x69, 0xd4, 0x81, 0xca, 0xd8, 0x25, 0xde, 0x88, 0x97, 0x6e,
0x37, 0x18, 0x09, 0x56, 0x54, 0xea, 0xcf, 0x17, 0x1d, 0x44, 0xcc, 0xda, 0x61, 0xca, 0x10, 0x3f,
0x70, 0xd4, 0x5f, 0x41, 0x25, 0x6d, 0xc1, 0xca, 0xc9, 0xc0, 0xd8, 0xee, 0xf7, 0xec, 0x6e, 0x67,
0xd0, 0x6d, 0x58, 0xad, 0x63, 0x6d, 0x89, 0x57, 0x8c, 0x31, 0xb0, 0x6c, 0xe3, 0xf0, 0xb0, 0x8f,
0x2d, 0x2d, 0xa3, 0xff, 0x3b, 0x0b, 0xcb, 0x02, 0x94, 0x41, 0x30, 0x0b, 0x87, 0x84, 0x9d, 0xe2,
0x0d, 0xb9, 0x8f, 0xa6, 0xce, 0x90, 0xc4, 0xa7, 0x18, 0x8f, 0x19, 0x20, 0xd1, 0xb5, 0x13, 0x8e,
0xe4, 0xce, 0xc5, 0x00, 0xfd, 0x11, 0x54, 0x7e, 0x9a, 0xd4, 0xa6, 0xf7, 0x53, 0xc2, 0xcf, 0xb1,
0x52, 0xdf, 0x98, 0x13, 0x9b, 0x9f, 0x15, 0xb5, 0xee, 0xa7, 0x04, 0x03, 0x4d, 0xe4, 0x74, 0x35,
0x28, 0x4f, 0xa8, 0x86, 0x39, 0x87, 0xf2, 0x29, 0x0e, 0xed, 0x27, 0x07, 0x52, 0x90, 0x51, 0x1e,
0xa1, 0x17, 0x1f, 0x12, 0xaa, 0x41, 0x21, 0xf0, 0xed, 0xd1, 0xc8, 0xab, 0x16, 0x79, 0x9a, 0x3f,
0x5b, 0xb4, 0xed, 0xfb, 0xed, 0xb6, 0xd9, 0x10, 0xb4, 0xc8, 0x07, 0x7e, 0x7b, 0xe4, 0xe9, 0x6f,
0xa1, 0x8c, 0x83, 0xbb, 0xd6, 0x35, 0x4f, 0x40, 0x87, 0xc2, 0x25, 0x19, 0x07, 0x21, 0x91, 0xcc,
0x02, 0x79, 0xf3, 0xe2, 0xe0, 0x0e, 0xcb, 0x19, 0xb4, 0x03, 0x79, 0x67, 0x1c, 0x93, 0x23, 0x6d,
0x22, 0x26, 0x74, 0x07, 0x4a, 0x38, 0xb8, 0xe3, 0xe7, 0x84, 0x9e, 0x81, 0x40, 0xc4, 0xf6, 0x9d,
0x49, 0x0c, 0x77, 0x99, 0x6b, 0x7a, 0xce, 0x84, 0xa0, 0x57, 0xa0, 0x86, 0xc1, 0x9d, 0x3d, 0xe4,
0xcb, 0x8b, 0xd2, 0x51, 0xeb, 0x9b, 0x29, 0x36, 0xc5, 0xc9, 0x61, 0x08, 0x63, 0x31, 0xd2, 0xdf,
0x02, 0xcc, 0xc9, 0xf0, 0xb9, 0x45, 0x7e, 0xc5, 0xe0, 0x23, 0xde, 0x28, 0x8e, 0xbf, 0x2c, 0x53,
0xe6, 0x11, 0xb0, 0x9c, 0x63, 0x40, 0x0c, 0xd8, 0x69, 0x1f, 0x51, 0x77, 0xf4, 0x03, 0x38, 0x82,
0x40, 0xb9, 0xa2, 0xee, 0x88, 0x93, 0xa3, 0x8c, 0xb9, 0xac, 0xbf, 0x81, 0xfc, 0x05, 0x0f, 0xf7,
0x0a, 0x54, 0x6e, 0x65, 0x33, 0x75, 0x5c, 0x34, 0xa9, 0x6d, 0x26, 0x4b, 0x63, 0x88, 0x62, 0x31,
0xd2, 0x1b, 0xb0, 0x72, 0x2a, 0x97, 0xe5, 0x06, 0x5f, 0x9e, 0x97, 0xfe, 0xbf, 0x2c, 0x14, 0x4f,
0x82, 0x59, 0xe8, 0x3b, 0x1e, 0xaa, 0x40, 0xd6, 0x1d, 0x71, 0xbf, 0x1c, 0xce, 0xba, 0x23, 0xf4,
0x17, 0xa8, 0x4c, 0xdc, 0xab, 0xd0, 0x61, 0x7c, 0x10, 0xd4, 0x16, 0xd5, 0xf9, 0xf3, 0xc5, 0xcc,
0xba, 0xb1, 0x05, 0xe7, 0xf7, 0xca, 0x64, 0x71, 0xb8, 0xc0, 0xd8, 0x5c, 0x8a, 0xb1, 0x2f, 0xa0,
0xe2, 0x05, 0x43, 0xc7, 0xb3, 0x93, 0xfb, 0x52, 0xe1, 0x49, 0xad, 0x70, 0xed, 0x59, 0x7c, 0x69,
0x3e, 0xc0, 0x25, 0xff, 0x44, 0x5c, 0xd0, 0x6b, 0x58, 0x9e, 0x3a, 0x21, 0x75, 0x87, 0xee, 0xd4,
0x61, 0x7f, 0x1c, 0x05, 0xee, 0x98, 0x4a, 0x3b, 0x85, 0x1b, 0x4e, 0x99, 0xa3, 0x97, 0xa0, 0x45,
0xfc, 0x2e, 0xb0, 0xef, 0x82, 0xf0, 0x66, 0xec, 0x05, 0x77, 0x51, 0xb5, 0xc8, 0xf3, 0x5f, 0x15,
0xfa, 0x77, 0xb1, 0x5a, 0xff, 0x26, 0x0b, 0x85, 0x0b, 0xc1, 0xb2, 0x7d, 0x50, 0x38, 0x46, 0xe2,
0xaf, 0x62, 0x6b, 0x71, 0x31, 0x61, 0xc1, 0x01, 0xe2, 0x36, 0xe8, 0x17, 0x50, 0xa6, 0xee, 0x84,
0x44, 0xd4, 0x99, 0x4c, 0x39, 0xa8, 0x39, 0x3c, 0x57, 0x7c, 0x8c, 0x2b, 0xec, 0xd7, 0x81, 0x15,
0xad, 0x80, 0x89, 0x89, 0xe8, 0x77, 0x50, 0x66, 0xb5, 0xc1, 0xff, 0x74, 0xaa, 0x79, 0x5e, 0x6c,
0x1b, 0x0f, 0x2a, 0x83, 0x2f, 0x8b, 0x4b, 0x61, 0x5c, 0x6d, 0x7f, 0x02, 0x95, 0xb3, 0x59, 0x3a,
0x89, 0xdb, 0x62, 0x2b, 0x7d, 0x5b, 0xc4, 0x55, 0x83, 0x61, 0x7e, 0xc1, 0xa2, 0x5d, 0xc8, 0xdf,
0xf2, 0x94, 0x8a, 0xf2, 0x8f, 0x6b, 0x71, 0x73, 0x1c, 0x7e, 0x31, 0xcf, 0xda, 0xd9, 0xdf, 0x04,
0x9b, 0xaa, 0xa5, 0xc7, 0xed, 0x4c, 0x12, 0x0d, 0xc7, 0x36, 0xe8, 0x39, 0x2c, 0x0f, 0x67, 0x61,
0xc8, 0xff, 0xe8, 0xdc, 0x09, 0xa9, 0x6e, 0x70, 0x28, 0x54, 0xa9, 0xb3, 0xdc, 0x09, 0xd1, 0xff,
0x99, 0x85, 0xca, 0x85, 0xe8, 0x79, 0x71, 0x9f, 0x7d, 0x03, 0xeb, 0x64, 0x3c, 0x26, 0x43, 0xea,
0xde, 0x12, 0x7b, 0xe8, 0x78, 0x1e, 0x09, 0x6d, 0x49, 0x5c, 0xb5, 0xbe, 0x5a, 0x13, 0xff, 0xbe,
0x2d, 0xae, 0xef, 0xb4, 0xf1, 0x5a, 0x62, 0x2b, 0x55, 0x23, 0x64, 0xc0, 0xba, 0x3b, 0x99, 0x90,
0x91, 0xeb, 0xd0, 0xc5, 0x00, 0xe2, 0xc6, 0xda, 0x94, 0xe5, 0x7f, 0x61, 0x1d, 0x39, 0x94, 0xcc,
0xc3, 0x24, 0x1e, 0x49, 0x98, 0x17, 0x8c, 0xdd, 0xe1, 0x55, 0xd2, 0xba, 0x57, 0xa4, 0xa7, 0xc5,
0x95, 0x58, 0x4e, 0xa6, 0x7e, 0x0b, 0x94, 0x07, 0xbf, 0x05, 0xf3, 0xab, 0x3b, 0xff, 0xb9, 0xab,
0x5b, 0x7f, 0x0d, 0xab, 0x09, 0x10, 0xb2, 0xed, 0xef, 0x43, 0x81, 0x1f, 0x65, 0x7c, 0x67, 0xa0,
0xc7, 0xac, 0xc3, 0xd2, 0x42, 0xff, 0x47, 0x16, 0x50, 0xec, 0x1f, 0xdc, 0x45, 0x3f, 0x51, 0x30,
0x37, 0x20, 0xcf, 0xf5, 0x12, 0x49, 0x31, 0x60, 0x38, 0x78, 0x4e, 0x44, 0xa7, 0x37, 0x09, 0x8c,
0xc2, 0xf9, 0x2d, 0xfb, 0x62, 0x12, 0xcd, 0x3c, 0x8a, 0xa5, 0x85, 0xfe, 0xff, 0x0c, 0xac, 0xa7,
0x70, 0x90, 0x58, 0xce, 0xdb, 0x40, 0xe6, 0xfb, 0xdb, 0x00, 0xda, 0x83, 0xd2, 0xf4, 0xe6, 0x13,
0xed, 0x22, 0x99, 0xfd, 0x68, 0x15, 0xff, 0x12, 0x94, 0x90, 0xdd, 0x26, 0x0a, 0xf7, 0x5c, 0xec,
0x8d, 0x5c, 0xcf, 0x1a, 0x6c, 0x6a, 0x1f, 0xa9, 0x06, 0x2b, 0x66, 0xf6, 0xff, 0x0c, 0xea, 0x42,
0x9f, 0x66, 0xbf, 0xf3, 0x9d, 0xa3, 0x5e, 0x1f, 0x1b, 0xda, 0x12, 0x2a, 0x81, 0x32, 0xb0, 0xfa,
0x67, 0x5a, 0x86, 0x49, 0xc6, 0x5f, 0x8d, 0x96, 0x78, 0x22, 0x30, 0xc9, 0x96, 0x46, 0xb9, 0xfd,
0xaf, 0x33, 0x00, 0xf3, 0x0b, 0x09, 0xa9, 0x50, 0x3c, 0xef, 0x9d, 0xf6, 0xfa, 0xef, 0x7a, 0x22,
0xc0, 0x91, 0xd5, 0x69, 0x6b, 0x19, 0x54, 0x86, 0xbc, 0x78, 0x73, 0x64, 0xd9, 0x0a, 0xf2, 0xc1,
0x91, 0x63, 0xaf, 0x91, 0xe4, 0xb5, 0xa1, 0xa0, 0x22, 0xe4, 0x92, 0x37, 0x85, 0x7c, 0x44, 0x14,
0x58, 0x40, 0x6c, 0x9c, 0x99, 0x8d, 0x96, 0xa1, 0x15, 0xd9, 0x44, 0xf2, 0x9c, 0x00, 0x28, 0xc4,
0x6f, 0x09, 0xe6, 0xc9, 0x5e, 0x20, 0xc0, 0xd6, 0xe9, 0x5b, 0xc7, 0x06, 0xd6, 0x54, 0xa6, 0xc3,
0xfd, 0x77, 0xda, 0x32, 0xd3, 0x1d, 0x76, 0x0c, 0xb3, 0xad, 0xad, 0xb0, 0x27, 0xc8, 0xb1, 0xd1,
0xc0, 0x56, 0xd3, 0x68, 0x58, 0x5a, 0x85, 0xcd, 0x5c, 0xf0, 0x04, 0x57, 0xd9, 0x32, 0x27, 0xfd,
0x73, 0xdc, 0x6b, 0x98, 0x9a, 0xb6, 0xbf, 0x0b, 0x2b, 0xa9, 0x3e, 0xc4, 0xd6, 0xb2, 0x1a, 0x4d,
0xd3, 0x18, 0x68, 0x4b, 0x4c, 0x1e, 0x1c, 0x37, 0x70, 0x7b, 0xa0, 0x65, 0x9a, 0x2f, 0xdf, 0xef,
0xde, 0xba, 0x94, 0x44, 0x51, 0xcd, 0x0d, 0x0e, 0x84, 0x74, 0x70, 0x15, 0x1c, 0xdc, 0xd2, 0x03,
0xfe, 0x1c, 0x3e, 0x98, 0x97, 0xcf, 0x65, 0x81, 0x6b, 0x7e, 0xff, 0x5d, 0x00, 0x00, 0x00, 0xff,
0xff, 0x49, 0x0f, 0x06, 0xcd, 0x6a, 0x0f, 0x00, 0x00,
// 1648 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4b, 0x73, 0xe3, 0x4a,
0x15, 0x8e, 0x6c, 0xf9, 0x75, 0x94, 0x38, 0x4a, 0xe7, 0x81, 0x49, 0x71, 0xa9, 0x5c, 0x15, 0x97,
0xe4, 0xa6, 0x0a, 0x07, 0x0c, 0x0c, 0xab, 0xcb, 0xc5, 0x0f, 0x25, 0x71, 0x22, 0xdb, 0x99, 0xb6,
0x92, 0xa1, 0x66, 0xa3, 0x52, 0xec, 0x76, 0x22, 0x22, 0x4b, 0x1e, 0xa9, 0x9d, 0x90, 0x1f, 0x40,
0xf1, 0x03, 0xd8, 0xf2, 0x07, 0x58, 0xb3, 0x85, 0x2d, 0x7b, 0xf6, 0x54, 0xb1, 0xe2, 0x7f, 0x50,
0xfd, 0x90, 0x6c, 0x25, 0xc3, 0x4c, 0x66, 0xaa, 0x58, 0xc0, 0xc6, 0x75, 0xfa, 0xf4, 0x39, 0xa7,
0xcf, 0xf9, 0xce, 0xa3, 0xd5, 0x06, 0xfd, 0xda, 0x0b, 0xfc, 0xf0, 0x66, 0xec, 0x52, 0xb7, 0x3e,
0x8b, 0x42, 0x1a, 0x22, 0x58, 0x70, 0x76, 0xb5, 0x7b, 0x1a, 0xcd, 0x46, 0x62, 0x63, 0x57, 0x7b,
0x37, 0x27, 0xd1, 0xa3, 0x5c, 0x54, 0x69, 0x38, 0x0b, 0x17, 0x5a, 0x46, 0x0f, 0x4a, 0xed, 0x5b,
0x37, 0x8a, 0x09, 0x45, 0x3b, 0x50, 0x1c, 0xf9, 0x1e, 0x09, 0x68, 0x4d, 0xd9, 0x53, 0x0e, 0x0a,
0x58, 0xae, 0x10, 0x02, 0x75, 0x14, 0x06, 0x41, 0x2d, 0xc7, 0xb9, 0x9c, 0x66, 0xb2, 0x31, 0x89,
0xee, 0x49, 0x54, 0xcb, 0x0b, 0x59, 0xb1, 0x32, 0xfe, 0x95, 0x87, 0x8d, 0x16, 0xf7, 0xc3, 0x8e,
0xdc, 0x20, 0x76, 0x47, 0xd4, 0x0b, 0x03, 0x74, 0x02, 0x10, 0x53, 0x97, 0x92, 0x29, 0x09, 0x68,
0x5c, 0x53, 0xf6, 0xf2, 0x07, 0x5a, 0x63, 0xbf, 0xbe, 0x14, 0xc1, 0x33, 0x95, 0xfa, 0x30, 0x91,
0xc7, 0x4b, 0xaa, 0xa8, 0x01, 0x1a, 0xb9, 0x27, 0x01, 0x75, 0x68, 0x78, 0x47, 0x82, 0x9a, 0xba,
0xa7, 0x1c, 0x68, 0x8d, 0x8d, 0xba, 0x08, 0xd0, 0x64, 0x3b, 0x36, 0xdb, 0xc0, 0x40, 0x52, 0x7a,
0xf7, 0x6f, 0x39, 0xa8, 0xa4, 0xd6, 0x90, 0x05, 0xe5, 0x91, 0x4b, 0xc9, 0x4d, 0x18, 0x3d, 0xf2,
0x30, 0xab, 0x8d, 0x1f, 0xbf, 0xd0, 0x91, 0x7a, 0x5b, 0xea, 0xe1, 0xd4, 0x02, 0xfa, 0x11, 0x94,
0x46, 0x02, 0x3d, 0x8e, 0x8e, 0xd6, 0xd8, 0x5c, 0x36, 0x26, 0x81, 0xc5, 0x89, 0x0c, 0xd2, 0x21,
0x1f, 0xbf, 0xf3, 0x39, 0x64, 0xab, 0x98, 0x91, 0xc6, 0x9f, 0x14, 0x28, 0x27, 0x76, 0xd1, 0x26,
0xac, 0xb7, 0x2c, 0xe7, 0xb2, 0x8f, 0xcd, 0xf6, 0xe0, 0xa4, 0xdf, 0x7d, 0x6b, 0x76, 0xf4, 0x15,
0xb4, 0x0a, 0xe5, 0x96, 0xe5, 0xb4, 0xcc, 0x93, 0x6e, 0x5f, 0x57, 0xd0, 0x1a, 0x54, 0x5a, 0x96,
0xd3, 0x1e, 0xf4, 0x7a, 0x5d, 0x5b, 0xcf, 0xa1, 0x75, 0xd0, 0x5a, 0x96, 0x83, 0x07, 0x96, 0xd5,
0x6a, 0xb6, 0xcf, 0xf5, 0x3c, 0xda, 0x86, 0x8d, 0x96, 0xe5, 0x74, 0x7a, 0x96, 0xd3, 0x31, 0x2f,
0xb0, 0xd9, 0x6e, 0xda, 0x66, 0x47, 0x57, 0x11, 0x40, 0x91, 0xb1, 0x3b, 0x96, 0x5e, 0x90, 0xf4,
0xd0, 0xb4, 0xf5, 0xa2, 0x34, 0xd7, 0xed, 0x0f, 0x4d, 0x6c, 0xeb, 0x25, 0xb9, 0xbc, 0xbc, 0xe8,
0x34, 0x6d, 0x53, 0x2f, 0xcb, 0x65, 0xc7, 0xb4, 0x4c, 0xdb, 0xd4, 0x2b, 0x67, 0x6a, 0x39, 0xa7,
0xe7, 0xcf, 0xd4, 0x72, 0x5e, 0x57, 0x8d, 0x3f, 0x28, 0xb0, 0x3d, 0xa4, 0x11, 0x71, 0xa7, 0xe7,
0xe4, 0x11, 0xbb, 0xc1, 0x0d, 0xc1, 0xe4, 0xdd, 0x9c, 0xc4, 0x14, 0xed, 0x42, 0x79, 0x16, 0xc6,
0x1e, 0xc3, 0x8e, 0x03, 0x5c, 0xc1, 0xe9, 0x1a, 0x1d, 0x41, 0xe5, 0x8e, 0x3c, 0x3a, 0x11, 0x93,
0x97, 0x80, 0xa1, 0x7a, 0x5a, 0x90, 0xa9, 0xa5, 0xf2, 0x9d, 0xa4, 0x96, 0xf1, 0xcd, 0x7f, 0x1c,
0x5f, 0x63, 0x02, 0x3b, 0x4f, 0x9d, 0x8a, 0x67, 0x61, 0x10, 0x13, 0x64, 0x01, 0x12, 0x8a, 0x0e,
0x5d, 0xe4, 0x96, 0xfb, 0xa7, 0x35, 0xbe, 0xf8, 0x60, 0x01, 0xe0, 0x8d, 0xeb, 0xa7, 0x2c, 0xe3,
0xb7, 0xb0, 0x29, 0xce, 0xb1, 0xdd, 0x6b, 0x9f, 0xc4, 0x2f, 0x09, 0x7d, 0x07, 0x8a, 0x94, 0x0b,
0xd7, 0x72, 0x7b, 0xf9, 0x83, 0x0a, 0x96, 0xab, 0x4f, 0x8d, 0x70, 0x0c, 0x5b, 0xd9, 0x93, 0xff,
0x2b, 0xf1, 0xfd, 0x0c, 0x54, 0x3c, 0xf7, 0x09, 0xda, 0x82, 0xc2, 0xd4, 0xa5, 0xa3, 0x5b, 0x19,
0x8d, 0x58, 0xb0, 0x50, 0x26, 0x9e, 0x4f, 0x49, 0xc4, 0x53, 0x58, 0xc1, 0x72, 0x65, 0xfc, 0x59,
0x81, 0xe2, 0x31, 0x27, 0xd1, 0x0f, 0xa1, 0x10, 0xcd, 0x59, 0xb0, 0xa2, 0xd7, 0xf5, 0x65, 0x0f,
0x98, 0x65, 0x2c, 0xb6, 0x51, 0x17, 0xaa, 0x13, 0x8f, 0xf8, 0x63, 0xde, 0xba, 0xbd, 0x70, 0x2c,
0xaa, 0xa2, 0xda, 0xf8, 0x72, 0x59, 0x41, 0xd8, 0xac, 0x1f, 0x67, 0x04, 0xf1, 0x13, 0x45, 0xe3,
0x15, 0x54, 0xb3, 0x12, 0xac, 0x9d, 0x4c, 0x8c, 0x9d, 0x41, 0xdf, 0xe9, 0x75, 0x87, 0xbd, 0xa6,
0xdd, 0x3e, 0xd5, 0x57, 0x78, 0xc7, 0x98, 0x43, 0xdb, 0x31, 0x8f, 0x8f, 0x07, 0xd8, 0xd6, 0x15,
0xe3, 0x8f, 0x39, 0x58, 0x15, 0xa0, 0x0c, 0xc3, 0x79, 0x34, 0x22, 0x2c, 0x8b, 0x77, 0xe4, 0x31,
0x9e, 0xb9, 0x23, 0x92, 0x64, 0x31, 0x59, 0x33, 0x40, 0xe2, 0x5b, 0x37, 0x1a, 0xcb, 0xc8, 0xc5,
0x02, 0xfd, 0x1c, 0x34, 0x9e, 0x4d, 0xea, 0xd0, 0xc7, 0x19, 0xe1, 0x79, 0xac, 0x36, 0xb6, 0x16,
0x85, 0xcd, 0x73, 0x45, 0xed, 0xc7, 0x19, 0xc1, 0x40, 0x53, 0x3a, 0xdb, 0x0d, 0xea, 0x0b, 0xba,
0x61, 0x51, 0x43, 0x85, 0x4c, 0x0d, 0x1d, 0xa6, 0x09, 0x29, 0x4a, 0x2b, 0xcf, 0xd0, 0x4b, 0x92,
0x84, 0xea, 0x50, 0x0c, 0x03, 0x67, 0x3c, 0xf6, 0x6b, 0x25, 0xee, 0xe6, 0x77, 0x96, 0x65, 0x07,
0x41, 0xa7, 0x63, 0x35, 0x45, 0x59, 0x14, 0xc2, 0xa0, 0x33, 0xf6, 0x8d, 0xd7, 0x50, 0xc1, 0xe1,
0x43, 0xfb, 0x96, 0x3b, 0x60, 0x40, 0xf1, 0x9a, 0x4c, 0xc2, 0x88, 0xc8, 0xca, 0x02, 0x39, 0x79,
0x71, 0xf8, 0x80, 0xe5, 0x0e, 0xda, 0x83, 0x82, 0x3b, 0x49, 0x8a, 0x23, 0x2b, 0x22, 0x36, 0x0c,
0x17, 0xca, 0x38, 0x7c, 0xe0, 0x79, 0x42, 0x5f, 0x80, 0x40, 0xc4, 0x09, 0xdc, 0x69, 0x02, 0x77,
0x85, 0x73, 0xfa, 0xee, 0x94, 0xa0, 0x57, 0xa0, 0x45, 0xe1, 0x83, 0x33, 0xe2, 0xc7, 0x8b, 0xd6,
0xd1, 0x1a, 0xdb, 0x99, 0x6a, 0x4a, 0x9c, 0xc3, 0x10, 0x25, 0x64, 0x6c, 0xbc, 0x06, 0x58, 0x14,
0xc3, 0xc7, 0x0e, 0xf9, 0x01, 0x83, 0x8f, 0xf8, 0xe3, 0xc4, 0xfe, 0xaa, 0x74, 0x99, 0x5b, 0xc0,
0x72, 0x8f, 0x01, 0x31, 0x64, 0xd9, 0x3e, 0xa1, 0xde, 0xf8, 0x33, 0x6a, 0x04, 0x81, 0x7a, 0x43,
0xbd, 0x31, 0x2f, 0x8e, 0x0a, 0xe6, 0xb4, 0xf1, 0x2d, 0x14, 0xae, 0xb8, 0xb9, 0x57, 0xa0, 0x71,
0x29, 0x87, 0xb1, 0x93, 0xa6, 0xc9, 0x84, 0x99, 0x1e, 0x8d, 0x21, 0x4e, 0xc8, 0xd8, 0x68, 0xc2,
0xda, 0xb9, 0x3c, 0x96, 0x0b, 0x7c, 0xba, 0x5f, 0xc6, 0x5f, 0x72, 0x50, 0x3a, 0x0b, 0xe7, 0x51,
0xe0, 0xfa, 0xa8, 0x0a, 0x39, 0x6f, 0xcc, 0xf5, 0xf2, 0x38, 0xe7, 0x8d, 0xd1, 0xaf, 0xa0, 0x3a,
0xf5, 0x6e, 0x22, 0x97, 0xd5, 0x83, 0x28, 0x6d, 0xd1, 0x9d, 0xdf, 0x5d, 0xf6, 0xac, 0x97, 0x48,
0xf0, 0xfa, 0x5e, 0x9b, 0x2e, 0x2f, 0x97, 0x2a, 0x36, 0x9f, 0xa9, 0xd8, 0xaf, 0xa0, 0xea, 0x87,
0x23, 0xd7, 0x77, 0xd2, 0x79, 0xa9, 0x72, 0xa7, 0xd6, 0x38, 0xf7, 0x22, 0x19, 0x9a, 0x4f, 0x70,
0x29, 0xbc, 0x10, 0x17, 0xf4, 0x0d, 0xac, 0xce, 0xdc, 0x88, 0x7a, 0x23, 0x6f, 0xe6, 0xb2, 0x2f,
0x8e, 0x22, 0x57, 0xcc, 0xb8, 0x9d, 0xc1, 0x0d, 0x67, 0xc4, 0xd1, 0xd7, 0xa0, 0xc7, 0x7c, 0x16,
0x38, 0x0f, 0x61, 0x74, 0x37, 0xf1, 0xc3, 0x87, 0xb8, 0x56, 0xe2, 0xfe, 0xaf, 0x0b, 0xfe, 0x9b,
0x84, 0x6d, 0xfc, 0x33, 0x07, 0xc5, 0x2b, 0x51, 0x65, 0x87, 0xa0, 0x72, 0x8c, 0xc4, 0x57, 0xc5,
0xce, 0xf2, 0x61, 0x42, 0x82, 0x03, 0xc4, 0x65, 0xd0, 0xf7, 0xa0, 0x42, 0xbd, 0x29, 0x89, 0xa9,
0x3b, 0x9d, 0x71, 0x50, 0xf3, 0x78, 0xc1, 0x78, 0x5f, 0xad, 0xb0, 0x4f, 0x07, 0xd6, 0xb4, 0x02,
0x26, 0x46, 0xa2, 0x9f, 0x40, 0x85, 0xf5, 0x06, 0xff, 0xd2, 0xa9, 0x15, 0x78, 0xb3, 0x6d, 0x3d,
0xe9, 0x0c, 0x7e, 0x2c, 0x2e, 0x47, 0x49, 0xb7, 0xfd, 0x02, 0x34, 0x5e, 0xcd, 0x52, 0x49, 0x4c,
0x8b, 0x9d, 0xec, 0xb4, 0x48, 0xba, 0x06, 0xc3, 0x62, 0xc0, 0xa2, 0x7d, 0x28, 0xdc, 0x73, 0x97,
0x4a, 0xf2, 0x8b, 0x6b, 0x39, 0x38, 0x0e, 0xbf, 0xd8, 0x67, 0xd7, 0xd9, 0x6f, 0x44, 0x35, 0xd5,
0xca, 0xcf, 0xaf, 0x33, 0x59, 0x68, 0x38, 0x91, 0x41, 0x5f, 0xc2, 0xea, 0x68, 0x1e, 0x45, 0xfc,
0x8b, 0xce, 0x9b, 0x92, 0xda, 0x16, 0x87, 0x42, 0x93, 0x3c, 0xdb, 0x9b, 0x12, 0xe3, 0xf7, 0x39,
0xa8, 0x5e, 0x89, 0x3b, 0x2f, 0xb9, 0x67, 0xbf, 0x85, 0x4d, 0x32, 0x99, 0x90, 0x11, 0xf5, 0xee,
0x89, 0x33, 0x72, 0x7d, 0x9f, 0x44, 0x8e, 0x2c, 0x5c, 0xad, 0xb1, 0x5e, 0x17, 0xdf, 0xbe, 0x6d,
0xce, 0xef, 0x76, 0xf0, 0x46, 0x2a, 0x2b, 0x59, 0x63, 0x64, 0xc2, 0xa6, 0x37, 0x9d, 0x92, 0xb1,
0xe7, 0xd2, 0x65, 0x03, 0x62, 0x62, 0x6d, 0xcb, 0xf6, 0xbf, 0xb2, 0x4f, 0x5c, 0x4a, 0x16, 0x66,
0x52, 0x8d, 0xd4, 0xcc, 0x57, 0xac, 0xba, 0xa3, 0x9b, 0xf4, 0xea, 0x5e, 0x93, 0x9a, 0x36, 0x67,
0x62, 0xb9, 0x99, 0xf9, 0x2c, 0x50, 0x9f, 0x7c, 0x16, 0x2c, 0x46, 0x77, 0xe1, 0x63, 0xa3, 0xdb,
0xf8, 0x06, 0xd6, 0x53, 0x20, 0xe4, 0xb5, 0x7f, 0x08, 0x45, 0x9e, 0xca, 0x64, 0x66, 0xa0, 0xe7,
0x55, 0x87, 0xa5, 0x84, 0xf1, 0xbb, 0x1c, 0xa0, 0x44, 0x3f, 0x7c, 0x88, 0xff, 0x47, 0xc1, 0xdc,
0x82, 0x02, 0xe7, 0x4b, 0x24, 0xc5, 0x82, 0xe1, 0xe0, 0xbb, 0x31, 0x9d, 0xdd, 0xa5, 0x30, 0x0a,
0xe5, 0xd7, 0xec, 0x17, 0x93, 0x78, 0xee, 0x53, 0x2c, 0x25, 0x8c, 0xbf, 0x2a, 0xb0, 0x99, 0xc1,
0x41, 0x62, 0xb9, 0xb8, 0x06, 0x94, 0xff, 0x7c, 0x0d, 0xa0, 0x03, 0x28, 0xcf, 0xee, 0x3e, 0x70,
0x5d, 0xa4, 0xbb, 0xef, 0xed, 0xe2, 0xef, 0x83, 0x1a, 0xb1, 0x69, 0xa2, 0x72, 0xcd, 0xe5, 0xbb,
0x91, 0xf3, 0xd9, 0x05, 0x9b, 0x89, 0x23, 0x73, 0xc1, 0x4a, 0xff, 0xff, 0xa1, 0xc0, 0xf6, 0xa2,
0x0e, 0xe6, 0x3e, 0xfd, 0xbf, 0x4a, 0xa5, 0x11, 0xc1, 0xce, 0xd3, 0xe8, 0x3e, 0x29, 0x41, 0x9f,
0x01, 0xfb, 0xe1, 0x2f, 0x41, 0x5b, 0xfa, 0xf4, 0x61, 0x2f, 0xa4, 0xee, 0x49, 0x7f, 0x80, 0x4d,
0x7d, 0x05, 0x95, 0x41, 0x1d, 0xda, 0x83, 0x0b, 0x5d, 0x61, 0x94, 0xf9, 0x6b, 0xb3, 0x2d, 0x5e,
0x5d, 0x8c, 0x72, 0xa4, 0x50, 0xfe, 0xf0, 0xef, 0x0a, 0xc0, 0x62, 0xc6, 0x23, 0x0d, 0x4a, 0x97,
0xfd, 0xf3, 0xfe, 0xe0, 0x4d, 0x5f, 0x18, 0x38, 0xb1, 0xbb, 0x1d, 0x5d, 0x41, 0x15, 0x28, 0x88,
0x67, 0x5c, 0x8e, 0x9d, 0x20, 0xdf, 0x70, 0x79, 0xf6, 0xc0, 0x4b, 0x1f, 0x70, 0x2a, 0x2a, 0x41,
0x3e, 0x7d, 0xa6, 0xc9, 0x77, 0x59, 0x91, 0x19, 0xc4, 0xe6, 0x85, 0xd5, 0x6c, 0x9b, 0x7a, 0x89,
0x6d, 0xa4, 0x2f, 0x34, 0x80, 0x62, 0xf2, 0x3c, 0x63, 0x9a, 0xec, 0x51, 0x07, 0xec, 0x9c, 0x81,
0x7d, 0x6a, 0x62, 0x5d, 0x63, 0x3c, 0x3c, 0x78, 0xa3, 0xaf, 0x32, 0xde, 0x71, 0xd7, 0xb4, 0x3a,
0xfa, 0x1a, 0x7b, 0xd5, 0x9d, 0x9a, 0x4d, 0x6c, 0xb7, 0xcc, 0xa6, 0xad, 0x57, 0xd9, 0xce, 0x15,
0x77, 0x70, 0x9d, 0x1d, 0x73, 0x36, 0xb8, 0xc4, 0xfd, 0xa6, 0xa5, 0xeb, 0x87, 0xfb, 0xb0, 0x96,
0xb9, 0xda, 0xd9, 0x59, 0x76, 0xb3, 0x65, 0x99, 0x43, 0x7d, 0x85, 0xd1, 0xc3, 0xd3, 0x26, 0xee,
0x0c, 0x75, 0xa5, 0xf5, 0xf5, 0xdb, 0xfd, 0x7b, 0x8f, 0x92, 0x38, 0xae, 0x7b, 0xe1, 0x91, 0xa0,
0x8e, 0x6e, 0xc2, 0xa3, 0x7b, 0x7a, 0xc4, 0xff, 0x61, 0x38, 0x5a, 0x4c, 0xa4, 0xeb, 0x22, 0xe7,
0xfc, 0xf4, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x09, 0xf3, 0xd7, 0xbd, 0x10, 0x00, 0x00,
}

Просмотреть файл

@ -6,11 +6,12 @@ package binlogservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
binlogdata "vitess.io/vitess/go/vt/proto/binlogdata"
)

Просмотреть файл

@ -6,11 +6,12 @@ package mysqlctl
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -5,8 +5,9 @@ package query
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
topodata "vitess.io/vitess/go/vt/proto/topodata"
vtrpc "vitess.io/vitess/go/vt/proto/vtrpc"
)

Просмотреть файл

@ -6,11 +6,12 @@ package queryservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
binlogdata "vitess.io/vitess/go/vt/proto/binlogdata"
query "vitess.io/vitess/go/vt/proto/query"
)
@ -29,43 +30,44 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("queryservice.proto", fileDescriptor_4bd2dde8711f22e3) }
var fileDescriptor_4bd2dde8711f22e3 = []byte{
// 563 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x95, 0x4f, 0x6f, 0xd3, 0x4c,
0x10, 0xc6, 0xdf, 0xf7, 0xd0, 0x06, 0x4d, 0x52, 0x28, 0x5b, 0x0a, 0xd4, 0x2d, 0x69, 0xe9, 0x0d,
0x21, 0x25, 0x08, 0x90, 0x90, 0x2a, 0x71, 0x68, 0x2c, 0x2a, 0x50, 0xc5, 0x3f, 0x87, 0x56, 0x88,
0x03, 0xd2, 0xc6, 0x5e, 0x05, 0xab, 0x8e, 0xd7, 0xf5, 0x6e, 0x52, 0xf8, 0x7c, 0x7c, 0x31, 0x84,
0xd7, 0x33, 0xde, 0xdd, 0xd8, 0xdc, 0xb2, 0xcf, 0x33, 0xf3, 0xd3, 0x78, 0x27, 0x33, 0x0b, 0xec,
0x7a, 0x29, 0xca, 0x5f, 0x4a, 0x94, 0xab, 0x34, 0x16, 0xa3, 0xa2, 0x94, 0x5a, 0xb2, 0x81, 0xad,
0x05, 0xfd, 0xea, 0x64, 0xac, 0x60, 0x7b, 0x96, 0xe6, 0x99, 0x9c, 0x27, 0x5c, 0x73, 0xa3, 0x3c,
0xff, 0xbd, 0x05, 0x1b, 0x9f, 0xff, 0x46, 0xb0, 0x13, 0xe8, 0xbd, 0xf9, 0x29, 0xe2, 0xa5, 0x16,
0x6c, 0x77, 0x64, 0x92, 0xea, 0x73, 0x24, 0xae, 0x97, 0x42, 0xe9, 0xe0, 0xbe, 0x2f, 0xab, 0x42,
0xe6, 0x4a, 0x1c, 0xff, 0xc7, 0xde, 0xc1, 0xa0, 0x16, 0x27, 0x5c, 0xc7, 0x3f, 0x58, 0xe0, 0x46,
0x56, 0x22, 0x52, 0xf6, 0x5b, 0x3d, 0x42, 0x7d, 0x80, 0xad, 0xa9, 0x2e, 0x05, 0x5f, 0x60, 0x31,
0x18, 0xef, 0xa8, 0x08, 0x3b, 0x68, 0x37, 0x91, 0xf6, 0xec, 0x7f, 0xf6, 0x12, 0x36, 0x26, 0x62,
0x9e, 0xe6, 0x6c, 0xa7, 0x0e, 0xad, 0x4e, 0x98, 0x7f, 0xcf, 0x15, 0xa9, 0x8a, 0x57, 0xb0, 0x19,
0xca, 0xc5, 0x22, 0xd5, 0x0c, 0x23, 0xcc, 0x11, 0xf3, 0x76, 0x3d, 0x95, 0x12, 0x5f, 0xc3, 0xad,
0x48, 0x66, 0xd9, 0x8c, 0xc7, 0x57, 0x0c, 0xef, 0x0b, 0x05, 0x4c, 0x7e, 0xb0, 0xa6, 0x53, 0xfa,
0x09, 0xf4, 0x3e, 0x95, 0xa2, 0xe0, 0x65, 0xd3, 0x84, 0xfa, 0xec, 0x37, 0x81, 0x64, 0xca, 0xfd,
0x08, 0xb7, 0x4d, 0x39, 0xb5, 0x95, 0xb0, 0x03, 0xa7, 0x4a, 0x94, 0x91, 0xf4, 0xa8, 0xc3, 0x25,
0xe0, 0x05, 0x6c, 0x63, 0x89, 0x84, 0x1c, 0x7a, 0xb5, 0xfb, 0xd0, 0xc3, 0x4e, 0x9f, 0xb0, 0x5f,
0xe1, 0x6e, 0x58, 0x0a, 0xae, 0xc5, 0x97, 0x92, 0xe7, 0x8a, 0xc7, 0x3a, 0x95, 0x39, 0xc3, 0xbc,
0x35, 0x07, 0xc1, 0x47, 0xdd, 0x01, 0x44, 0x3e, 0x83, 0xfe, 0x54, 0xf3, 0x52, 0xd7, 0xad, 0xdb,
0xa3, 0x3f, 0x07, 0x69, 0x48, 0x0b, 0xda, 0x2c, 0x87, 0x23, 0x34, 0xf5, 0x91, 0x38, 0x8d, 0xb6,
0xc6, 0xb1, 0x2d, 0xe2, 0x7c, 0x87, 0x9d, 0x50, 0xe6, 0x71, 0xb6, 0x4c, 0x9c, 0x6f, 0x7d, 0x4c,
0x17, 0xbf, 0xe6, 0x21, 0xf7, 0xf8, 0x5f, 0x21, 0xc4, 0x8f, 0xe0, 0x4e, 0x24, 0x78, 0x62, 0xb3,
0xb1, 0xa9, 0x9e, 0x8e, 0xdc, 0x61, 0x97, 0x6d, 0x8f, 0x72, 0x35, 0x0c, 0x38, 0x7e, 0x81, 0x3d,
0x21, 0xde, 0xf4, 0xed, 0xb7, 0x7a, 0x76, 0xa3, 0x6d, 0xc7, 0xac, 0x86, 0xc3, 0x96, 0x1c, 0x67,
0x3f, 0x1c, 0x75, 0x07, 0xd8, 0x4b, 0xe2, 0xbd, 0x50, 0x8a, 0xcf, 0x85, 0x19, 0x7c, 0x5a, 0x12,
0x8e, 0xea, 0x2f, 0x09, 0xcf, 0xb4, 0x96, 0x44, 0x08, 0x50, 0x9b, 0xa7, 0xf1, 0x15, 0x7b, 0xe8,
0xc6, 0x9f, 0x36, 0xed, 0xde, 0x6b, 0x71, 0xa8, 0xa8, 0x10, 0x60, 0x5a, 0x64, 0xa9, 0x36, 0xeb,
0x14, 0x21, 0x8d, 0xe4, 0x43, 0x6c, 0x87, 0x20, 0xe7, 0x30, 0x30, 0xf5, 0xbd, 0x15, 0x3c, 0xd3,
0xcd, 0x26, 0xb5, 0x45, 0xff, 0xfa, 0x5d, 0xcf, 0xfa, 0xac, 0x73, 0x18, 0x5c, 0x14, 0x09, 0xd7,
0x78, 0x4b, 0x08, 0xb3, 0x45, 0x1f, 0xe6, 0x7a, 0x16, 0xec, 0x0c, 0x7a, 0x97, 0xc4, 0xb1, 0xde,
0x91, 0x4b, 0x9f, 0xd3, 0xe6, 0x59, 0x9c, 0x08, 0xfa, 0x28, 0xcb, 0x1b, 0xc5, 0x86, 0x6d, 0xf1,
0xf2, 0x46, 0x35, 0x0b, 0xa5, 0xcb, 0x6f, 0x98, 0x93, 0xa7, 0xdf, 0x9e, 0xac, 0x52, 0x2d, 0x94,
0x1a, 0xa5, 0x72, 0x6c, 0x7e, 0x8d, 0xe7, 0x72, 0xbc, 0xd2, 0xe3, 0xea, 0x95, 0x1b, 0xdb, 0x2f,
0xe2, 0x6c, 0xb3, 0xd2, 0x5e, 0xfc, 0x09, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x23, 0x8f, 0x51, 0x3c,
0x07, 0x00, 0x00,
// 582 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x95, 0xdf, 0x6f, 0xd3, 0x30,
0x10, 0xc7, 0xe1, 0x61, 0x2b, 0xba, 0x96, 0x32, 0x3c, 0x06, 0x2c, 0x1b, 0xdd, 0x8f, 0x37, 0x84,
0xd4, 0x22, 0x40, 0x42, 0x9a, 0xc4, 0xc3, 0x5a, 0x31, 0x81, 0x26, 0x7e, 0xb5, 0x6c, 0x42, 0x20,
0x21, 0xb9, 0xa9, 0x55, 0xa2, 0xa5, 0x71, 0x16, 0x3b, 0x1d, 0xfc, 0x37, 0xfc, 0xa9, 0xd3, 0xe2,
0xdc, 0xc5, 0x76, 0x93, 0xbd, 0xcd, 0xdf, 0xef, 0xdd, 0x67, 0x17, 0x5f, 0xef, 0x0c, 0xec, 0x32,
0x17, 0xd9, 0x3f, 0x25, 0xb2, 0x65, 0x14, 0x8a, 0x7e, 0x9a, 0x49, 0x2d, 0x59, 0xc7, 0xd6, 0x82,
0x76, 0x71, 0x32, 0x56, 0xb0, 0x31, 0x8d, 0x92, 0x58, 0xce, 0x67, 0x5c, 0x73, 0xa3, 0xbc, 0xfa,
0xdf, 0x85, 0xb5, 0x6f, 0x37, 0x11, 0xec, 0x08, 0x5a, 0xef, 0xff, 0x8a, 0x30, 0xd7, 0x82, 0x6d,
0xf5, 0x4d, 0x52, 0x79, 0x1e, 0x8b, 0xcb, 0x5c, 0x28, 0x1d, 0x3c, 0xf6, 0x65, 0x95, 0xca, 0x44,
0x89, 0xc3, 0x3b, 0xec, 0x23, 0x74, 0x4a, 0x71, 0xc8, 0x75, 0xf8, 0x87, 0x05, 0x6e, 0x64, 0x21,
0x22, 0x65, 0xa7, 0xd6, 0x23, 0xd4, 0x67, 0xb8, 0x3f, 0xd1, 0x99, 0xe0, 0x0b, 0x2c, 0x06, 0xe3,
0x1d, 0x15, 0x61, 0xbb, 0xf5, 0x26, 0xd2, 0x5e, 0xde, 0x65, 0x6f, 0x60, 0x6d, 0x28, 0xe6, 0x51,
0xc2, 0x36, 0xcb, 0xd0, 0xe2, 0x84, 0xf9, 0x8f, 0x5c, 0x91, 0xaa, 0x78, 0x0b, 0xeb, 0x23, 0xb9,
0x58, 0x44, 0x9a, 0x61, 0x84, 0x39, 0x62, 0xde, 0x96, 0xa7, 0x52, 0xe2, 0x3b, 0xb8, 0x37, 0x96,
0x71, 0x3c, 0xe5, 0xe1, 0x05, 0xc3, 0xfb, 0x42, 0x01, 0x93, 0x9f, 0xac, 0xe8, 0x94, 0x7e, 0x04,
0xad, 0xaf, 0x99, 0x48, 0x79, 0x56, 0x35, 0xa1, 0x3c, 0xfb, 0x4d, 0x20, 0x99, 0x72, 0xbf, 0x40,
0xd7, 0x94, 0x53, 0x5a, 0x33, 0xb6, 0xeb, 0x54, 0x89, 0x32, 0x92, 0x9e, 0x35, 0xb8, 0x04, 0x3c,
0x83, 0x0d, 0x2c, 0x91, 0x90, 0x3d, 0xaf, 0x76, 0x1f, 0xba, 0xd7, 0xe8, 0x13, 0xf6, 0x07, 0x3c,
0x1c, 0x65, 0x82, 0x6b, 0xf1, 0x3d, 0xe3, 0x89, 0xe2, 0xa1, 0x8e, 0x64, 0xc2, 0x30, 0x6f, 0xc5,
0x41, 0xf0, 0x7e, 0x73, 0x00, 0x91, 0x4f, 0xa0, 0x3d, 0xd1, 0x3c, 0xd3, 0x65, 0xeb, 0xb6, 0xe9,
0xc7, 0x41, 0x1a, 0xd2, 0x82, 0x3a, 0xcb, 0xe1, 0x08, 0x4d, 0x7d, 0x24, 0x4e, 0xa5, 0xad, 0x70,
0x6c, 0x8b, 0x38, 0xbf, 0x61, 0x73, 0x24, 0x93, 0x30, 0xce, 0x67, 0xce, 0xb7, 0x1e, 0xd0, 0xc5,
0xaf, 0x78, 0xc8, 0x3d, 0xbc, 0x2d, 0x84, 0xf8, 0x63, 0x78, 0x30, 0x16, 0x7c, 0x66, 0xb3, 0xb1,
0xa9, 0x9e, 0x8e, 0xdc, 0x5e, 0x93, 0x6d, 0x8f, 0x72, 0x31, 0x0c, 0x38, 0x7e, 0x81, 0x3d, 0x21,
0xde, 0xf4, 0xed, 0xd4, 0x7a, 0x76, 0xa3, 0x6d, 0xc7, 0xac, 0x86, 0xbd, 0x9a, 0x1c, 0x67, 0x3f,
0xec, 0x37, 0x07, 0xd8, 0x4b, 0xe2, 0x93, 0x50, 0x8a, 0xcf, 0x85, 0x19, 0x7c, 0x5a, 0x12, 0x8e,
0xea, 0x2f, 0x09, 0xcf, 0xb4, 0x96, 0xc4, 0x08, 0xa0, 0x34, 0x8f, 0xc3, 0x0b, 0xf6, 0xd4, 0x8d,
0x3f, 0xae, 0xda, 0xbd, 0x5d, 0xe3, 0x50, 0x51, 0x23, 0x80, 0x49, 0x1a, 0x47, 0xda, 0xac, 0x53,
0x84, 0x54, 0x92, 0x0f, 0xb1, 0x1d, 0x82, 0x9c, 0x42, 0xc7, 0xd4, 0xf7, 0x41, 0xf0, 0x58, 0x57,
0x9b, 0xd4, 0x16, 0xfd, 0xeb, 0x77, 0x3d, 0xeb, 0xb3, 0x4e, 0xa1, 0x73, 0x96, 0xce, 0xb8, 0xc6,
0x5b, 0x42, 0x98, 0x2d, 0xfa, 0x30, 0xd7, 0xb3, 0x60, 0x27, 0xd0, 0x3a, 0x27, 0x8e, 0xf5, 0x8e,
0x9c, 0xfb, 0x9c, 0x3a, 0xcf, 0xe2, 0x8c, 0xa1, 0x8d, 0xb2, 0xbc, 0x52, 0xac, 0x57, 0x17, 0x2f,
0xaf, 0x54, 0xb5, 0x50, 0x9a, 0x7c, 0x8b, 0xf9, 0x0b, 0xba, 0xd5, 0xbf, 0xca, 0x63, 0xad, 0xd8,
0x41, 0x7d, 0x19, 0x37, 0x5e, 0x35, 0x63, 0xb7, 0x84, 0x54, 0xf0, 0xe1, 0x8b, 0x9f, 0xcf, 0x97,
0x91, 0x16, 0x4a, 0xf5, 0x23, 0x39, 0x30, 0x7f, 0x0d, 0xe6, 0x72, 0xb0, 0xd4, 0x83, 0xe2, 0x09,
0x1d, 0xd8, 0xcf, 0xed, 0x74, 0xbd, 0xd0, 0x5e, 0x5f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xb4,
0xc0, 0x34, 0x99, 0x07, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -133,6 +135,8 @@ type QueryClient interface {
VStream(ctx context.Context, in *binlogdata.VStreamRequest, opts ...grpc.CallOption) (Query_VStreamClient, error)
// VStreamRows streams rows from the specified starting point.
VStreamRows(ctx context.Context, in *binlogdata.VStreamRowsRequest, opts ...grpc.CallOption) (Query_VStreamRowsClient, error)
// VStreamResults streams results along with the gtid of the snapshot.
VStreamResults(ctx context.Context, in *binlogdata.VStreamResultsRequest, opts ...grpc.CallOption) (Query_VStreamResultsClient, error)
}
type queryClient struct {
@ -488,6 +492,38 @@ func (x *queryVStreamRowsClient) Recv() (*binlogdata.VStreamRowsResponse, error)
return m, nil
}
func (c *queryClient) VStreamResults(ctx context.Context, in *binlogdata.VStreamResultsRequest, opts ...grpc.CallOption) (Query_VStreamResultsClient, error) {
stream, err := c.cc.NewStream(ctx, &_Query_serviceDesc.Streams[6], "/queryservice.Query/VStreamResults", opts...)
if err != nil {
return nil, err
}
x := &queryVStreamResultsClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type Query_VStreamResultsClient interface {
Recv() (*binlogdata.VStreamResultsResponse, error)
grpc.ClientStream
}
type queryVStreamResultsClient struct {
grpc.ClientStream
}
func (x *queryVStreamResultsClient) Recv() (*binlogdata.VStreamResultsResponse, error) {
m := new(binlogdata.VStreamResultsResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// QueryServer is the server API for Query service.
type QueryServer interface {
// Execute executes the specified SQL query (might be in a
@ -543,6 +579,8 @@ type QueryServer interface {
VStream(*binlogdata.VStreamRequest, Query_VStreamServer) error
// VStreamRows streams rows from the specified starting point.
VStreamRows(*binlogdata.VStreamRowsRequest, Query_VStreamRowsServer) error
// VStreamResults streams results along with the gtid of the snapshot.
VStreamResults(*binlogdata.VStreamResultsRequest, Query_VStreamResultsServer) error
}
// UnimplementedQueryServer can be embedded to have forward compatible implementations.
@ -618,6 +656,9 @@ func (*UnimplementedQueryServer) VStream(req *binlogdata.VStreamRequest, srv Que
func (*UnimplementedQueryServer) VStreamRows(req *binlogdata.VStreamRowsRequest, srv Query_VStreamRowsServer) error {
return status.Errorf(codes.Unimplemented, "method VStreamRows not implemented")
}
func (*UnimplementedQueryServer) VStreamResults(req *binlogdata.VStreamResultsRequest, srv Query_VStreamResultsServer) error {
return status.Errorf(codes.Unimplemented, "method VStreamResults not implemented")
}
func RegisterQueryServer(s *grpc.Server, srv QueryServer) {
s.RegisterService(&_Query_serviceDesc, srv)
@ -1055,6 +1096,27 @@ func (x *queryVStreamRowsServer) Send(m *binlogdata.VStreamRowsResponse) error {
return x.ServerStream.SendMsg(m)
}
func _Query_VStreamResults_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(binlogdata.VStreamResultsRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(QueryServer).VStreamResults(m, &queryVStreamResultsServer{stream})
}
type Query_VStreamResultsServer interface {
Send(*binlogdata.VStreamResultsResponse) error
grpc.ServerStream
}
type queryVStreamResultsServer struct {
grpc.ServerStream
}
func (x *queryVStreamResultsServer) Send(m *binlogdata.VStreamResultsResponse) error {
return x.ServerStream.SendMsg(m)
}
var _Query_serviceDesc = grpc.ServiceDesc{
ServiceName: "queryservice.Query",
HandlerType: (*QueryServer)(nil),
@ -1159,6 +1221,11 @@ var _Query_serviceDesc = grpc.ServiceDesc{
Handler: _Query_VStreamRows_Handler,
ServerStreams: true,
},
{
StreamName: "VStreamResults",
Handler: _Query_VStreamResults_Handler,
ServerStreams: true,
},
},
Metadata: "queryservice.proto",
}

Просмотреть файл

@ -5,8 +5,9 @@ package replicationdata
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -5,8 +5,9 @@ package tableacl
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -38,10 +38,13 @@ type TableDefinition struct {
// how much space the data file takes.
DataLength uint64 `protobuf:"varint,6,opt,name=data_length,json=dataLength,proto3" json:"data_length,omitempty"`
// approximate number of rows
RowCount uint64 `protobuf:"varint,7,opt,name=row_count,json=rowCount,proto3" json:"row_count,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
RowCount uint64 `protobuf:"varint,7,opt,name=row_count,json=rowCount,proto3" json:"row_count,omitempty"`
// column names along with their types.
// NOTE: this is a superset of columns.
Fields []*query.Field `protobuf:"bytes,8,rep,name=fields,proto3" json:"fields,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TableDefinition) Reset() { *m = TableDefinition{} }
@ -118,6 +121,13 @@ func (m *TableDefinition) GetRowCount() uint64 {
return 0
}
func (m *TableDefinition) GetFields() []*query.Field {
if m != nil {
return m.Fields
}
return nil
}
type SchemaDefinition struct {
DatabaseSchema string `protobuf:"bytes,1,opt,name=database_schema,json=databaseSchema,proto3" json:"database_schema,omitempty"`
TableDefinitions []*TableDefinition `protobuf:"bytes,2,rep,name=table_definitions,json=tableDefinitions,proto3" json:"table_definitions,omitempty"`
@ -2046,6 +2056,76 @@ func (m *MasterPositionResponse) GetPosition() string {
return ""
}
type WaitForPositionRequest struct {
Position string `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *WaitForPositionRequest) Reset() { *m = WaitForPositionRequest{} }
func (m *WaitForPositionRequest) String() string { return proto.CompactTextString(m) }
func (*WaitForPositionRequest) ProtoMessage() {}
func (*WaitForPositionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ff9ac4f89e61ffa4, []int{48}
}
func (m *WaitForPositionRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitForPositionRequest.Unmarshal(m, b)
}
func (m *WaitForPositionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WaitForPositionRequest.Marshal(b, m, deterministic)
}
func (m *WaitForPositionRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_WaitForPositionRequest.Merge(m, src)
}
func (m *WaitForPositionRequest) XXX_Size() int {
return xxx_messageInfo_WaitForPositionRequest.Size(m)
}
func (m *WaitForPositionRequest) XXX_DiscardUnknown() {
xxx_messageInfo_WaitForPositionRequest.DiscardUnknown(m)
}
var xxx_messageInfo_WaitForPositionRequest proto.InternalMessageInfo
func (m *WaitForPositionRequest) GetPosition() string {
if m != nil {
return m.Position
}
return ""
}
type WaitForPositionResponse struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *WaitForPositionResponse) Reset() { *m = WaitForPositionResponse{} }
func (m *WaitForPositionResponse) String() string { return proto.CompactTextString(m) }
func (*WaitForPositionResponse) ProtoMessage() {}
func (*WaitForPositionResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ff9ac4f89e61ffa4, []int{49}
}
func (m *WaitForPositionResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitForPositionResponse.Unmarshal(m, b)
}
func (m *WaitForPositionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WaitForPositionResponse.Marshal(b, m, deterministic)
}
func (m *WaitForPositionResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_WaitForPositionResponse.Merge(m, src)
}
func (m *WaitForPositionResponse) XXX_Size() int {
return xxx_messageInfo_WaitForPositionResponse.Size(m)
}
func (m *WaitForPositionResponse) XXX_DiscardUnknown() {
xxx_messageInfo_WaitForPositionResponse.DiscardUnknown(m)
}
var xxx_messageInfo_WaitForPositionResponse proto.InternalMessageInfo
type StopSlaveRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@ -2056,7 +2136,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_ff9ac4f89e61ffa4, []int{48}
return fileDescriptor_ff9ac4f89e61ffa4, []int{50}
}
func (m *StopSlaveRequest) XXX_Unmarshal(b []byte) error {
@ -2087,7 +2167,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_ff9ac4f89e61ffa4, []int{49}
return fileDescriptor_ff9ac4f89e61ffa4, []int{51}
}
func (m *StopSlaveResponse) XXX_Unmarshal(b []byte) error {
@ -2120,7 +2200,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_ff9ac4f89e61ffa4, []int{50}
return fileDescriptor_ff9ac4f89e61ffa4, []int{52}
}
func (m *StopSlaveMinimumRequest) XXX_Unmarshal(b []byte) error {
@ -2166,7 +2246,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_ff9ac4f89e61ffa4, []int{51}
return fileDescriptor_ff9ac4f89e61ffa4, []int{53}
}
func (m *StopSlaveMinimumResponse) XXX_Unmarshal(b []byte) error {
@ -2204,7 +2284,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_ff9ac4f89e61ffa4, []int{52}
return fileDescriptor_ff9ac4f89e61ffa4, []int{54}
}
func (m *StartSlaveRequest) XXX_Unmarshal(b []byte) error {
@ -2235,7 +2315,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_ff9ac4f89e61ffa4, []int{53}
return fileDescriptor_ff9ac4f89e61ffa4, []int{55}
}
func (m *StartSlaveResponse) XXX_Unmarshal(b []byte) error {
@ -2268,7 +2348,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_ff9ac4f89e61ffa4, []int{54}
return fileDescriptor_ff9ac4f89e61ffa4, []int{56}
}
func (m *StartSlaveUntilAfterRequest) XXX_Unmarshal(b []byte) error {
@ -2313,7 +2393,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_ff9ac4f89e61ffa4, []int{55}
return fileDescriptor_ff9ac4f89e61ffa4, []int{57}
}
func (m *StartSlaveUntilAfterResponse) XXX_Unmarshal(b []byte) error {
@ -2348,7 +2428,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_ff9ac4f89e61ffa4, []int{56}
return fileDescriptor_ff9ac4f89e61ffa4, []int{58}
}
func (m *TabletExternallyReparentedRequest) XXX_Unmarshal(b []byte) error {
@ -2386,7 +2466,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_ff9ac4f89e61ffa4, []int{57}
return fileDescriptor_ff9ac4f89e61ffa4, []int{59}
}
func (m *TabletExternallyReparentedResponse) XXX_Unmarshal(b []byte) error {
@ -2417,7 +2497,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_ff9ac4f89e61ffa4, []int{58}
return fileDescriptor_ff9ac4f89e61ffa4, []int{60}
}
func (m *TabletExternallyElectedRequest) XXX_Unmarshal(b []byte) error {
@ -2448,7 +2528,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_ff9ac4f89e61ffa4, []int{59}
return fileDescriptor_ff9ac4f89e61ffa4, []int{61}
}
func (m *TabletExternallyElectedResponse) XXX_Unmarshal(b []byte) error {
@ -2479,7 +2559,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_ff9ac4f89e61ffa4, []int{60}
return fileDescriptor_ff9ac4f89e61ffa4, []int{62}
}
func (m *GetSlavesRequest) XXX_Unmarshal(b []byte) error {
@ -2511,7 +2591,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_ff9ac4f89e61ffa4, []int{61}
return fileDescriptor_ff9ac4f89e61ffa4, []int{63}
}
func (m *GetSlavesResponse) XXX_Unmarshal(b []byte) error {
@ -2549,7 +2629,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_ff9ac4f89e61ffa4, []int{62}
return fileDescriptor_ff9ac4f89e61ffa4, []int{64}
}
func (m *ResetReplicationRequest) XXX_Unmarshal(b []byte) error {
@ -2580,7 +2660,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_ff9ac4f89e61ffa4, []int{63}
return fileDescriptor_ff9ac4f89e61ffa4, []int{65}
}
func (m *ResetReplicationResponse) XXX_Unmarshal(b []byte) error {
@ -2612,7 +2692,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_ff9ac4f89e61ffa4, []int{64}
return fileDescriptor_ff9ac4f89e61ffa4, []int{66}
}
func (m *VReplicationExecRequest) XXX_Unmarshal(b []byte) error {
@ -2651,7 +2731,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_ff9ac4f89e61ffa4, []int{65}
return fileDescriptor_ff9ac4f89e61ffa4, []int{67}
}
func (m *VReplicationExecResponse) XXX_Unmarshal(b []byte) error {
@ -2691,7 +2771,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_ff9ac4f89e61ffa4, []int{66}
return fileDescriptor_ff9ac4f89e61ffa4, []int{68}
}
func (m *VReplicationWaitForPosRequest) XXX_Unmarshal(b []byte) error {
@ -2736,7 +2816,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_ff9ac4f89e61ffa4, []int{67}
return fileDescriptor_ff9ac4f89e61ffa4, []int{69}
}
func (m *VReplicationWaitForPosResponse) XXX_Unmarshal(b []byte) error {
@ -2767,7 +2847,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_ff9ac4f89e61ffa4, []int{68}
return fileDescriptor_ff9ac4f89e61ffa4, []int{70}
}
func (m *InitMasterRequest) XXX_Unmarshal(b []byte) error {
@ -2799,7 +2879,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_ff9ac4f89e61ffa4, []int{69}
return fileDescriptor_ff9ac4f89e61ffa4, []int{71}
}
func (m *InitMasterResponse) XXX_Unmarshal(b []byte) error {
@ -2841,7 +2921,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_ff9ac4f89e61ffa4, []int{70}
return fileDescriptor_ff9ac4f89e61ffa4, []int{72}
}
func (m *PopulateReparentJournalRequest) XXX_Unmarshal(b []byte) error {
@ -2900,7 +2980,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_ff9ac4f89e61ffa4, []int{71}
return fileDescriptor_ff9ac4f89e61ffa4, []int{73}
}
func (m *PopulateReparentJournalResponse) XXX_Unmarshal(b []byte) error {
@ -2934,7 +3014,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_ff9ac4f89e61ffa4, []int{72}
return fileDescriptor_ff9ac4f89e61ffa4, []int{74}
}
func (m *InitSlaveRequest) XXX_Unmarshal(b []byte) error {
@ -2986,7 +3066,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_ff9ac4f89e61ffa4, []int{73}
return fileDescriptor_ff9ac4f89e61ffa4, []int{75}
}
func (m *InitSlaveResponse) XXX_Unmarshal(b []byte) error {
@ -3017,7 +3097,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_ff9ac4f89e61ffa4, []int{74}
return fileDescriptor_ff9ac4f89e61ffa4, []int{76}
}
func (m *DemoteMasterRequest) XXX_Unmarshal(b []byte) error {
@ -3049,7 +3129,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_ff9ac4f89e61ffa4, []int{75}
return fileDescriptor_ff9ac4f89e61ffa4, []int{77}
}
func (m *DemoteMasterResponse) XXX_Unmarshal(b []byte) error {
@ -3087,7 +3167,7 @@ func (m *UndoDemoteMasterRequest) Reset() { *m = UndoDemoteMasterRequest
func (m *UndoDemoteMasterRequest) String() string { return proto.CompactTextString(m) }
func (*UndoDemoteMasterRequest) ProtoMessage() {}
func (*UndoDemoteMasterRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ff9ac4f89e61ffa4, []int{76}
return fileDescriptor_ff9ac4f89e61ffa4, []int{78}
}
func (m *UndoDemoteMasterRequest) XXX_Unmarshal(b []byte) error {
@ -3118,7 +3198,7 @@ func (m *UndoDemoteMasterResponse) Reset() { *m = UndoDemoteMasterRespon
func (m *UndoDemoteMasterResponse) String() string { return proto.CompactTextString(m) }
func (*UndoDemoteMasterResponse) ProtoMessage() {}
func (*UndoDemoteMasterResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ff9ac4f89e61ffa4, []int{77}
return fileDescriptor_ff9ac4f89e61ffa4, []int{79}
}
func (m *UndoDemoteMasterResponse) XXX_Unmarshal(b []byte) error {
@ -3150,7 +3230,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_ff9ac4f89e61ffa4, []int{78}
return fileDescriptor_ff9ac4f89e61ffa4, []int{80}
}
func (m *PromoteSlaveWhenCaughtUpRequest) XXX_Unmarshal(b []byte) error {
@ -3189,7 +3269,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_ff9ac4f89e61ffa4, []int{79}
return fileDescriptor_ff9ac4f89e61ffa4, []int{81}
}
func (m *PromoteSlaveWhenCaughtUpResponse) XXX_Unmarshal(b []byte) error {
@ -3227,7 +3307,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_ff9ac4f89e61ffa4, []int{80}
return fileDescriptor_ff9ac4f89e61ffa4, []int{82}
}
func (m *SlaveWasPromotedRequest) XXX_Unmarshal(b []byte) error {
@ -3258,7 +3338,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_ff9ac4f89e61ffa4, []int{81}
return fileDescriptor_ff9ac4f89e61ffa4, []int{83}
}
func (m *SlaveWasPromotedResponse) XXX_Unmarshal(b []byte) error {
@ -3282,6 +3362,7 @@ var xxx_messageInfo_SlaveWasPromotedResponse proto.InternalMessageInfo
type SetMasterRequest struct {
Parent *topodata.TabletAlias `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
TimeCreatedNs int64 `protobuf:"varint,2,opt,name=time_created_ns,json=timeCreatedNs,proto3" json:"time_created_ns,omitempty"`
WaitPosition string `protobuf:"bytes,4,opt,name=wait_position,json=waitPosition,proto3" json:"wait_position,omitempty"`
ForceStartSlave bool `protobuf:"varint,3,opt,name=force_start_slave,json=forceStartSlave,proto3" json:"force_start_slave,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
@ -3292,7 +3373,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_ff9ac4f89e61ffa4, []int{82}
return fileDescriptor_ff9ac4f89e61ffa4, []int{84}
}
func (m *SetMasterRequest) XXX_Unmarshal(b []byte) error {
@ -3327,6 +3408,13 @@ func (m *SetMasterRequest) GetTimeCreatedNs() int64 {
return 0
}
func (m *SetMasterRequest) GetWaitPosition() string {
if m != nil {
return m.WaitPosition
}
return ""
}
func (m *SetMasterRequest) GetForceStartSlave() bool {
if m != nil {
return m.ForceStartSlave
@ -3344,7 +3432,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_ff9ac4f89e61ffa4, []int{83}
return fileDescriptor_ff9ac4f89e61ffa4, []int{85}
}
func (m *SetMasterResponse) XXX_Unmarshal(b []byte) error {
@ -3377,7 +3465,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_ff9ac4f89e61ffa4, []int{84}
return fileDescriptor_ff9ac4f89e61ffa4, []int{86}
}
func (m *SlaveWasRestartedRequest) XXX_Unmarshal(b []byte) error {
@ -3415,7 +3503,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_ff9ac4f89e61ffa4, []int{85}
return fileDescriptor_ff9ac4f89e61ffa4, []int{87}
}
func (m *SlaveWasRestartedResponse) XXX_Unmarshal(b []byte) error {
@ -3446,7 +3534,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_ff9ac4f89e61ffa4, []int{86}
return fileDescriptor_ff9ac4f89e61ffa4, []int{88}
}
func (m *StopReplicationAndGetStatusRequest) XXX_Unmarshal(b []byte) error {
@ -3478,7 +3566,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_ff9ac4f89e61ffa4, []int{87}
return fileDescriptor_ff9ac4f89e61ffa4, []int{89}
}
func (m *StopReplicationAndGetStatusResponse) XXX_Unmarshal(b []byte) error {
@ -3516,7 +3604,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_ff9ac4f89e61ffa4, []int{88}
return fileDescriptor_ff9ac4f89e61ffa4, []int{90}
}
func (m *PromoteSlaveRequest) XXX_Unmarshal(b []byte) error {
@ -3548,7 +3636,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_ff9ac4f89e61ffa4, []int{89}
return fileDescriptor_ff9ac4f89e61ffa4, []int{91}
}
func (m *PromoteSlaveResponse) XXX_Unmarshal(b []byte) error {
@ -3588,7 +3676,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_ff9ac4f89e61ffa4, []int{90}
return fileDescriptor_ff9ac4f89e61ffa4, []int{92}
}
func (m *BackupRequest) XXX_Unmarshal(b []byte) error {
@ -3634,7 +3722,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_ff9ac4f89e61ffa4, []int{91}
return fileDescriptor_ff9ac4f89e61ffa4, []int{93}
}
func (m *BackupResponse) XXX_Unmarshal(b []byte) error {
@ -3672,7 +3760,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_ff9ac4f89e61ffa4, []int{92}
return fileDescriptor_ff9ac4f89e61ffa4, []int{94}
}
func (m *RestoreFromBackupRequest) XXX_Unmarshal(b []byte) error {
@ -3704,7 +3792,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_ff9ac4f89e61ffa4, []int{93}
return fileDescriptor_ff9ac4f89e61ffa4, []int{95}
}
func (m *RestoreFromBackupResponse) XXX_Unmarshal(b []byte) error {
@ -3784,6 +3872,8 @@ func init() {
proto.RegisterType((*SlaveStatusResponse)(nil), "tabletmanagerdata.SlaveStatusResponse")
proto.RegisterType((*MasterPositionRequest)(nil), "tabletmanagerdata.MasterPositionRequest")
proto.RegisterType((*MasterPositionResponse)(nil), "tabletmanagerdata.MasterPositionResponse")
proto.RegisterType((*WaitForPositionRequest)(nil), "tabletmanagerdata.WaitForPositionRequest")
proto.RegisterType((*WaitForPositionResponse)(nil), "tabletmanagerdata.WaitForPositionResponse")
proto.RegisterType((*StopSlaveRequest)(nil), "tabletmanagerdata.StopSlaveRequest")
proto.RegisterType((*StopSlaveResponse)(nil), "tabletmanagerdata.StopSlaveResponse")
proto.RegisterType((*StopSlaveMinimumRequest)(nil), "tabletmanagerdata.StopSlaveMinimumRequest")
@ -3835,135 +3925,137 @@ func init() {
func init() { proto.RegisterFile("tabletmanagerdata.proto", fileDescriptor_ff9ac4f89e61ffa4) }
var fileDescriptor_ff9ac4f89e61ffa4 = []byte{
// 2074 bytes of a gzipped FileDescriptorProto
// 2108 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x5b, 0x6f, 0x1b, 0xc7,
0xf5, 0x07, 0x49, 0x49, 0x96, 0x0e, 0x2f, 0x22, 0x97, 0x94, 0x48, 0xc9, 0xff, 0x48, 0xf2, 0xda,
0xf9, 0xc7, 0x75, 0x51, 0x2a, 0x51, 0xd2, 0x20, 0x48, 0x91, 0xa2, 0xb2, 0x2e, 0xb6, 0x13, 0x25,
0x56, 0x56, 0x96, 0x5d, 0x04, 0x05, 0x16, 0x43, 0xee, 0x88, 0x5c, 0x68, 0xb9, 0xb3, 0x9e, 0x99,
0xa5, 0xc4, 0x2f, 0xd1, 0xb7, 0xbe, 0xf5, 0xad, 0x40, 0xfb, 0xde, 0x0f, 0x93, 0xa2, 0x9f, 0xa4,
0x0f, 0x7d, 0x29, 0xe6, 0xb2, 0xe4, 0x2c, 0xb9, 0xb4, 0x25, 0xc1, 0x05, 0xfa, 0x22, 0xf0, 0xfc,
0xce, 0x99, 0x73, 0x9b, 0x73, 0xce, 0x9c, 0x85, 0xa0, 0xc9, 0x51, 0x27, 0xc0, 0x7c, 0x80, 0x42,
0xd4, 0xc3, 0xd4, 0x43, 0x1c, 0xb5, 0x23, 0x4a, 0x38, 0xb1, 0x6a, 0x33, 0x8c, 0xcd, 0xe2, 0xdb,
0x18, 0xd3, 0x91, 0xe2, 0x6f, 0x56, 0x38, 0x89, 0xc8, 0x44, 0x7e, 0x73, 0x8d, 0xe2, 0x28, 0xf0,
0xbb, 0x88, 0xfb, 0x24, 0x34, 0xe0, 0x72, 0x40, 0x7a, 0x31, 0xf7, 0x03, 0x45, 0xda, 0xff, 0xcc,
0xc1, 0xea, 0x2b, 0xa1, 0xf8, 0x10, 0x5f, 0xf8, 0xa1, 0x2f, 0x84, 0x2d, 0x0b, 0x16, 0x42, 0x34,
0xc0, 0xad, 0xdc, 0x4e, 0xee, 0xf1, 0x8a, 0x23, 0x7f, 0x5b, 0xeb, 0xb0, 0xc4, 0xba, 0x7d, 0x3c,
0x40, 0xad, 0xbc, 0x44, 0x35, 0x65, 0xb5, 0xe0, 0x5e, 0x97, 0x04, 0xf1, 0x20, 0x64, 0xad, 0xc2,
0x4e, 0xe1, 0xf1, 0x8a, 0x93, 0x90, 0x56, 0x1b, 0xea, 0x11, 0xf5, 0x07, 0x88, 0x8e, 0xdc, 0x4b,
0x3c, 0x72, 0x13, 0xa9, 0x05, 0x29, 0x55, 0xd3, 0xac, 0xef, 0xf0, 0xe8, 0x40, 0xcb, 0x5b, 0xb0,
0xc0, 0x47, 0x11, 0x6e, 0x2d, 0x2a, 0xab, 0xe2, 0xb7, 0xb5, 0x0d, 0x45, 0xe1, 0xba, 0x1b, 0xe0,
0xb0, 0xc7, 0xfb, 0xad, 0xa5, 0x9d, 0xdc, 0xe3, 0x05, 0x07, 0x04, 0x74, 0x22, 0x11, 0xeb, 0x3e,
0xac, 0x50, 0x72, 0xe5, 0x76, 0x49, 0x1c, 0xf2, 0xd6, 0x3d, 0xc9, 0x5e, 0xa6, 0xe4, 0xea, 0x40,
0xd0, 0xf6, 0x5f, 0x73, 0x50, 0x3d, 0x93, 0x6e, 0x1a, 0xc1, 0x7d, 0x02, 0xab, 0xe2, 0x7c, 0x07,
0x31, 0xec, 0xea, 0x88, 0x54, 0x9c, 0x95, 0x04, 0x56, 0x47, 0xac, 0x97, 0xa0, 0x32, 0xee, 0x7a,
0xe3, 0xc3, 0xac, 0x95, 0xdf, 0x29, 0x3c, 0x2e, 0xee, 0xd9, 0xed, 0xd9, 0x4b, 0x9a, 0x4a, 0xa2,
0x53, 0xe5, 0x69, 0x80, 0x89, 0x54, 0x0d, 0x31, 0x65, 0x3e, 0x09, 0x5b, 0x05, 0x69, 0x31, 0x21,
0x85, 0xa3, 0x96, 0xb2, 0x7a, 0xd0, 0x47, 0x61, 0x0f, 0x3b, 0x98, 0xc5, 0x01, 0xb7, 0x9e, 0x43,
0xb9, 0x83, 0x2f, 0x08, 0x4d, 0x39, 0x5a, 0xdc, 0x7b, 0x98, 0x61, 0x7d, 0x3a, 0x4c, 0xa7, 0xa4,
0x4e, 0xea, 0x58, 0x8e, 0xa1, 0x84, 0x2e, 0x38, 0xa6, 0xae, 0x71, 0x87, 0x37, 0x54, 0x54, 0x94,
0x07, 0x15, 0x6c, 0xff, 0x2b, 0x07, 0x95, 0x73, 0x86, 0xe9, 0x29, 0xa6, 0x03, 0x9f, 0x31, 0x5d,
0x2c, 0x7d, 0xc2, 0x78, 0x52, 0x2c, 0xe2, 0xb7, 0xc0, 0x62, 0x86, 0xa9, 0x2e, 0x15, 0xf9, 0xdb,
0xfa, 0x25, 0xd4, 0x22, 0xc4, 0xd8, 0x15, 0xa1, 0x9e, 0xdb, 0xed, 0xe3, 0xee, 0x25, 0x8b, 0x07,
0x32, 0x0f, 0x0b, 0x4e, 0x35, 0x61, 0x1c, 0x68, 0xdc, 0xfa, 0x11, 0x20, 0xa2, 0xfe, 0xd0, 0x0f,
0x70, 0x0f, 0xab, 0x92, 0x29, 0xee, 0x7d, 0x96, 0xe1, 0x6d, 0xda, 0x97, 0xf6, 0xe9, 0xf8, 0xcc,
0x51, 0xc8, 0xe9, 0xc8, 0x31, 0x94, 0x6c, 0x7e, 0x03, 0xab, 0x53, 0x6c, 0xab, 0x0a, 0x85, 0x4b,
0x3c, 0xd2, 0x9e, 0x8b, 0x9f, 0x56, 0x03, 0x16, 0x87, 0x28, 0x88, 0xb1, 0xf6, 0x5c, 0x11, 0x5f,
0xe7, 0xbf, 0xca, 0xd9, 0x3f, 0xe7, 0xa0, 0x74, 0xd8, 0x79, 0x4f, 0xdc, 0x15, 0xc8, 0x7b, 0x1d,
0x7d, 0x36, 0xef, 0x75, 0xc6, 0x79, 0x28, 0x18, 0x79, 0x78, 0x99, 0x11, 0xda, 0x6e, 0x46, 0x68,
0xa6, 0xb1, 0xff, 0x66, 0x60, 0x7f, 0xc9, 0x41, 0x71, 0x62, 0x89, 0x59, 0x27, 0x50, 0x15, 0x7e,
0xba, 0xd1, 0x04, 0x6b, 0xe5, 0xa4, 0x97, 0x0f, 0xde, 0x7b, 0x01, 0xce, 0x6a, 0x9c, 0xa2, 0x99,
0x75, 0x0c, 0x15, 0xaf, 0x93, 0xd2, 0xa5, 0x3a, 0x68, 0xfb, 0x3d, 0x11, 0x3b, 0x65, 0xcf, 0xa0,
0x98, 0xfd, 0x09, 0x14, 0x4f, 0xfd, 0xb0, 0xe7, 0xe0, 0xb7, 0x31, 0x66, 0x5c, 0xb4, 0x52, 0x84,
0x46, 0x01, 0x41, 0x9e, 0x0e, 0x32, 0x21, 0xed, 0xc7, 0x50, 0x52, 0x82, 0x2c, 0x22, 0x21, 0xc3,
0xef, 0x90, 0x7c, 0x02, 0xa5, 0xb3, 0x00, 0xe3, 0x28, 0xd1, 0xb9, 0x09, 0xcb, 0x5e, 0x4c, 0xe5,
0xb8, 0x94, 0xa2, 0x05, 0x67, 0x4c, 0xdb, 0xab, 0x50, 0xd6, 0xb2, 0x4a, 0xad, 0xfd, 0x8f, 0x1c,
0x58, 0x47, 0xd7, 0xb8, 0x1b, 0x73, 0xfc, 0x9c, 0x90, 0xcb, 0x44, 0x47, 0xd6, 0xe4, 0xdc, 0x02,
0x88, 0x10, 0x45, 0x03, 0xcc, 0x31, 0x55, 0xe1, 0xaf, 0x38, 0x06, 0x62, 0x9d, 0xc2, 0x0a, 0xbe,
0xe6, 0x14, 0xb9, 0x38, 0x1c, 0xca, 0x19, 0x5a, 0xdc, 0xfb, 0x3c, 0x23, 0x3b, 0xb3, 0xd6, 0xda,
0x47, 0xe2, 0xd8, 0x51, 0x38, 0x54, 0x35, 0xb1, 0x8c, 0x35, 0xb9, 0xf9, 0x1b, 0x28, 0xa7, 0x58,
0xb7, 0xaa, 0x87, 0x0b, 0xa8, 0xa7, 0x4c, 0xe9, 0x3c, 0x6e, 0x43, 0x11, 0x5f, 0xfb, 0xdc, 0x65,
0x1c, 0xf1, 0x98, 0xe9, 0x04, 0x81, 0x80, 0xce, 0x24, 0x22, 0x1f, 0x08, 0xee, 0x91, 0x98, 0x8f,
0x1f, 0x08, 0x49, 0x69, 0x1c, 0xd3, 0xa4, 0x0b, 0x34, 0x65, 0x0f, 0xa1, 0xfa, 0x0c, 0x73, 0x35,
0x57, 0x92, 0xf4, 0xad, 0xc3, 0x92, 0x0c, 0x5c, 0x55, 0xdc, 0x8a, 0xa3, 0x29, 0xeb, 0x21, 0x94,
0xfd, 0xb0, 0x1b, 0xc4, 0x1e, 0x76, 0x87, 0x3e, 0xbe, 0x62, 0xd2, 0xc4, 0xb2, 0x53, 0xd2, 0xe0,
0x6b, 0x81, 0x59, 0x1f, 0x43, 0x05, 0x5f, 0x2b, 0x21, 0xad, 0x44, 0x3d, 0x48, 0x65, 0x8d, 0xca,
0x01, 0xcd, 0x6c, 0x0c, 0x35, 0xc3, 0xae, 0x8e, 0xee, 0x14, 0x6a, 0x6a, 0x32, 0x1a, 0xc3, 0xfe,
0x36, 0xd3, 0xb6, 0xca, 0xa6, 0x10, 0xbb, 0x09, 0x6b, 0xcf, 0x30, 0x37, 0x4a, 0x58, 0xc7, 0x68,
0xff, 0x04, 0xeb, 0xd3, 0x0c, 0xed, 0xc4, 0xef, 0xa0, 0x98, 0x6e, 0x3a, 0x61, 0x7e, 0x2b, 0xc3,
0xbc, 0x79, 0xd8, 0x3c, 0x62, 0x37, 0xc0, 0x3a, 0xc3, 0xdc, 0xc1, 0xc8, 0x7b, 0x19, 0x06, 0xa3,
0xc4, 0xe2, 0x1a, 0xd4, 0x53, 0xa8, 0x2e, 0xe1, 0x09, 0xfc, 0x86, 0xfa, 0x1c, 0x27, 0xd2, 0xeb,
0xd0, 0x48, 0xc3, 0x5a, 0xfc, 0x5b, 0xa8, 0xa9, 0xc7, 0xe9, 0xd5, 0x28, 0x4a, 0x84, 0xad, 0x5f,
0x43, 0x51, 0xb9, 0xe7, 0xca, 0xa7, 0x5b, 0xb8, 0x5c, 0xd9, 0x6b, 0xb4, 0xc7, 0x9b, 0x88, 0xcc,
0x39, 0x97, 0x27, 0x80, 0x8f, 0x7f, 0x0b, 0x3f, 0x4d, 0x5d, 0x13, 0x87, 0x1c, 0x7c, 0x41, 0x31,
0xeb, 0x8b, 0x92, 0x32, 0x1d, 0x4a, 0xc3, 0x5a, 0xbc, 0x09, 0x6b, 0x4e, 0x1c, 0x3e, 0xc7, 0x28,
0xe0, 0x7d, 0xf9, 0x70, 0x24, 0x07, 0x5a, 0xb0, 0x3e, 0xcd, 0xd0, 0x47, 0xbe, 0x80, 0xd6, 0x8b,
0x5e, 0x48, 0x28, 0x56, 0xcc, 0x23, 0x4a, 0x09, 0x4d, 0x8d, 0x14, 0xce, 0x31, 0x0d, 0x27, 0x83,
0x42, 0x92, 0xf6, 0x7d, 0xd8, 0xc8, 0x38, 0xa5, 0x55, 0x7e, 0x2d, 0x9c, 0x16, 0xf3, 0x24, 0x5d,
0xc9, 0x0f, 0xa1, 0x7c, 0x85, 0x7c, 0xee, 0x46, 0x84, 0x4d, 0x8a, 0x69, 0xc5, 0x29, 0x09, 0xf0,
0x54, 0x63, 0x2a, 0x32, 0xf3, 0xac, 0xd6, 0xb9, 0x07, 0xeb, 0xa7, 0x14, 0x5f, 0x04, 0x7e, 0xaf,
0x3f, 0xd5, 0x20, 0x62, 0xdb, 0x92, 0x89, 0x4b, 0x3a, 0x24, 0x21, 0xed, 0x1e, 0x34, 0x67, 0xce,
0xe8, 0xba, 0x3a, 0x81, 0x8a, 0x92, 0x72, 0xa9, 0xdc, 0x2b, 0x92, 0x79, 0xfe, 0xf1, 0xdc, 0xca,
0x36, 0xb7, 0x10, 0xa7, 0xdc, 0x35, 0x28, 0x66, 0xff, 0x3b, 0x07, 0xd6, 0x7e, 0x14, 0x05, 0xa3,
0xb4, 0x67, 0x55, 0x28, 0xb0, 0xb7, 0x41, 0x32, 0x62, 0xd8, 0xdb, 0x40, 0x8c, 0x98, 0x0b, 0x42,
0xbb, 0x58, 0x37, 0xab, 0x22, 0xc4, 0x1a, 0x80, 0x82, 0x80, 0x5c, 0xb9, 0xc6, 0x76, 0x2a, 0x27,
0xc3, 0xb2, 0x53, 0x95, 0x0c, 0x67, 0x82, 0xcf, 0x2e, 0x40, 0x0b, 0x1f, 0x6a, 0x01, 0x5a, 0xbc,
0xe3, 0x02, 0xf4, 0xb7, 0x1c, 0xd4, 0x53, 0xd1, 0xeb, 0x1c, 0xff, 0xef, 0xad, 0x6a, 0x75, 0xa8,
0x9d, 0x90, 0xee, 0xa5, 0x9a, 0x7a, 0x49, 0x6b, 0x34, 0xc0, 0x32, 0xc1, 0x49, 0xe3, 0x9d, 0x87,
0xc1, 0x8c, 0xf0, 0x3a, 0x34, 0xd2, 0xb0, 0x16, 0xff, 0x7b, 0x0e, 0x5a, 0xfa, 0x89, 0x38, 0xc6,
0xbc, 0xdb, 0xdf, 0x67, 0x87, 0x9d, 0x71, 0x1d, 0x34, 0x60, 0x51, 0x7e, 0x94, 0xc8, 0x04, 0x94,
0x1c, 0x45, 0x58, 0x4d, 0xb8, 0xe7, 0x75, 0x5c, 0xf9, 0x34, 0xea, 0xd7, 0xc1, 0xeb, 0xfc, 0x20,
0x1e, 0xc7, 0x0d, 0x58, 0x1e, 0xa0, 0x6b, 0x97, 0x92, 0x2b, 0xa6, 0x97, 0xc1, 0x7b, 0x03, 0x74,
0xed, 0x90, 0x2b, 0x26, 0x17, 0x75, 0x9f, 0xc9, 0x0d, 0xbc, 0xe3, 0x87, 0x01, 0xe9, 0x31, 0x79,
0xfd, 0xcb, 0x4e, 0x45, 0xc3, 0x4f, 0x15, 0x2a, 0x7a, 0x8d, 0xca, 0x36, 0x32, 0x2f, 0x77, 0xd9,
0x29, 0x51, 0xa3, 0xb7, 0xec, 0x67, 0xb0, 0x91, 0xe1, 0xb3, 0xbe, 0xbd, 0x27, 0xb0, 0xa4, 0x5a,
0x43, 0x5f, 0x9b, 0xd5, 0x56, 0x1f, 0x56, 0x3f, 0x8a, 0xbf, 0xba, 0x0d, 0xb4, 0x84, 0xfd, 0xc7,
0x1c, 0x7c, 0x94, 0xd6, 0xb4, 0x1f, 0x04, 0x62, 0x01, 0x63, 0x1f, 0x3e, 0x05, 0x33, 0x91, 0x2d,
0x64, 0x44, 0x76, 0x02, 0x5b, 0xf3, 0xfc, 0xb9, 0x43, 0x78, 0xdf, 0x4d, 0xdf, 0xed, 0x7e, 0x14,
0xbd, 0x3b, 0x30, 0xd3, 0xff, 0x7c, 0xca, 0xff, 0xd9, 0xa4, 0x4b, 0x65, 0x77, 0xf0, 0x4a, 0x3c,
0x6c, 0x01, 0x1a, 0x62, 0xb5, 0x6b, 0x24, 0x05, 0x7a, 0x0c, 0xf5, 0x14, 0xaa, 0x15, 0xef, 0x8a,
0x8d, 0x63, 0xbc, 0xa5, 0x14, 0xf7, 0x9a, 0xed, 0xe9, 0x2f, 0x61, 0x7d, 0x40, 0x8b, 0x89, 0x97,
0xe4, 0x7b, 0xc4, 0x38, 0xa6, 0xc9, 0x64, 0x4e, 0x0c, 0x7c, 0x01, 0xeb, 0xd3, 0x0c, 0x6d, 0x63,
0x13, 0x96, 0xa7, 0x46, 0xfb, 0x98, 0xb6, 0x2d, 0xa8, 0x9e, 0x71, 0x12, 0x49, 0xd7, 0x12, 0x4d,
0x75, 0xa8, 0x19, 0x98, 0x6e, 0xa4, 0xdf, 0x43, 0x73, 0x0c, 0x7e, 0xef, 0x87, 0xfe, 0x20, 0x1e,
0x18, 0xcb, 0xe8, 0x3c, 0xfd, 0xd6, 0x03, 0x90, 0xcf, 0x88, 0xcb, 0xfd, 0x01, 0x4e, 0xf6, 0xad,
0x82, 0x53, 0x14, 0xd8, 0x2b, 0x05, 0xd9, 0x5f, 0x42, 0x6b, 0x56, 0xf3, 0x0d, 0x5c, 0x97, 0x6e,
0x22, 0xca, 0x53, 0xbe, 0x8b, 0xe4, 0x1b, 0xa0, 0x76, 0xfe, 0x0f, 0x70, 0x7f, 0x82, 0x9e, 0x87,
0xdc, 0x0f, 0xf6, 0xc5, 0xf4, 0xf9, 0x40, 0x01, 0x6c, 0xc1, 0xff, 0x65, 0x6b, 0xd7, 0xd6, 0x0f,
0xe1, 0x81, 0xda, 0x2d, 0x8e, 0xae, 0xc5, 0x1b, 0x8d, 0x02, 0xb1, 0xd8, 0x44, 0x88, 0xe2, 0x90,
0x63, 0x2f, 0xf1, 0x41, 0xee, 0xac, 0x8a, 0xed, 0xfa, 0xc9, 0xfe, 0x0f, 0x09, 0xf4, 0xc2, 0xb3,
0x1f, 0x81, 0xfd, 0x2e, 0x2d, 0xda, 0xd6, 0x0e, 0x6c, 0x4d, 0x4b, 0x1d, 0x05, 0xb8, 0x3b, 0x31,
0x64, 0x3f, 0x80, 0xed, 0xb9, 0x12, 0x5a, 0x89, 0xa5, 0xd6, 0x5d, 0x11, 0xce, 0xb8, 0x7e, 0x7f,
0xa1, 0x56, 0x51, 0x8d, 0xe9, 0xeb, 0x69, 0xc0, 0x22, 0xf2, 0x3c, 0x9a, 0x3c, 0xf0, 0x8a, 0xb0,
0x37, 0xa0, 0xe9, 0x60, 0x26, 0xf6, 0xb2, 0x71, 0x25, 0x27, 0x5a, 0x36, 0xa1, 0x35, 0xcb, 0xd2,
0x56, 0x77, 0xa1, 0xf9, 0xda, 0xc0, 0x45, 0x33, 0x66, 0x36, 0xf3, 0x8a, 0x6e, 0x66, 0xfb, 0x18,
0x5a, 0xb3, 0x07, 0xee, 0x34, 0x46, 0x3e, 0x32, 0xf5, 0xbc, 0x41, 0x3e, 0x3f, 0x26, 0xa2, 0x8d,
0x12, 0xf3, 0x15, 0xc8, 0xeb, 0x2b, 0x29, 0x38, 0x79, 0xdf, 0x4b, 0xd5, 0x4b, 0x7e, 0xaa, 0x2a,
0x77, 0x60, 0x6b, 0x9e, 0x32, 0x1d, 0x67, 0x1d, 0x6a, 0x2f, 0x42, 0x9f, 0xab, 0x66, 0x4d, 0x12,
0xf3, 0x29, 0x58, 0x26, 0x78, 0x83, 0xf2, 0xff, 0x39, 0x07, 0x5b, 0xa7, 0x24, 0x8a, 0x03, 0xb9,
0x67, 0xaa, 0x42, 0xf8, 0x96, 0xc4, 0xe2, 0x46, 0x13, 0xbf, 0xff, 0x1f, 0x56, 0x45, 0xd9, 0xba,
0x5d, 0x8a, 0x11, 0xc7, 0x9e, 0x1b, 0x26, 0xdf, 0x42, 0x65, 0x01, 0x1f, 0x28, 0xf4, 0x07, 0x26,
0x6a, 0x0f, 0x75, 0x85, 0x52, 0x73, 0xe4, 0x83, 0x82, 0xe4, 0xd8, 0xff, 0x0a, 0x4a, 0x03, 0xe9,
0x99, 0x8b, 0x02, 0x1f, 0xa9, 0xd1, 0x5f, 0xdc, 0x5b, 0x9b, 0xde, 0x9d, 0xf7, 0x05, 0xd3, 0x29,
0x2a, 0x51, 0x49, 0x58, 0x9f, 0x41, 0xc3, 0x18, 0x68, 0x93, 0x15, 0x73, 0x41, 0xda, 0xa8, 0x1b,
0xbc, 0xf1, 0xa6, 0xf9, 0x00, 0xb6, 0xe7, 0xc6, 0xa5, 0x53, 0xf8, 0xe7, 0x1c, 0x54, 0x45, 0xba,
0xcc, 0xd6, 0xb7, 0x7e, 0x05, 0x4b, 0x4a, 0x5a, 0x5f, 0xf9, 0x1c, 0xf7, 0xb4, 0xd0, 0x5c, 0xcf,
0xf2, 0x73, 0x3d, 0xcb, 0xca, 0x67, 0x21, 0x23, 0x9f, 0xc9, 0x0d, 0xa7, 0x67, 0xd0, 0x1a, 0xd4,
0x0f, 0xf1, 0x80, 0x70, 0x9c, 0xbe, 0xf8, 0x3d, 0x68, 0xa4, 0xe1, 0x1b, 0x5c, 0xfd, 0x06, 0x34,
0xcf, 0x43, 0x8f, 0x64, 0xa9, 0xdb, 0x84, 0xd6, 0x2c, 0x4b, 0x7b, 0xf0, 0x0d, 0x6c, 0x9f, 0x52,
0x22, 0x18, 0xd2, 0xb3, 0x37, 0x7d, 0x1c, 0x1e, 0xa0, 0xb8, 0xd7, 0xe7, 0xe7, 0xd1, 0x0d, 0x26,
0xa1, 0xfd, 0x5b, 0xd8, 0x99, 0x7f, 0xfc, 0x66, 0x5e, 0xab, 0x83, 0x88, 0x69, 0x3d, 0x9e, 0xe1,
0xf5, 0x2c, 0x4b, 0x7b, 0xfd, 0xa7, 0x1c, 0x54, 0xcf, 0x70, 0xba, 0x5d, 0x6e, 0x7b, 0xd7, 0x19,
0x17, 0x97, 0xcf, 0x6a, 0x84, 0x27, 0x50, 0x93, 0x9b, 0xbf, 0xcb, 0xc4, 0x3c, 0x77, 0x99, 0xf0,
0x49, 0x2f, 0xfc, 0xab, 0x92, 0x31, 0x99, 0xf3, 0xf2, 0xf9, 0xc1, 0x53, 0x0d, 0x6b, 0xbf, 0x98,
0x04, 0xe2, 0x60, 0xa9, 0x64, 0x32, 0xe1, 0x6f, 0xe7, 0xb3, 0xf8, 0x92, 0xcb, 0x50, 0xa5, 0xed,
0x3c, 0x02, 0x5b, 0xbc, 0x99, 0xc6, 0xa0, 0xd9, 0x0f, 0x3d, 0x31, 0x9f, 0x53, 0x3b, 0xc7, 0x6b,
0x78, 0xf8, 0x4e, 0xa9, 0xbb, 0xee, 0x20, 0x6b, 0x50, 0x37, 0x2b, 0xc1, 0x28, 0xe5, 0x34, 0x7c,
0x83, 0xa2, 0x38, 0x83, 0xf2, 0x53, 0xd4, 0xbd, 0x8c, 0xc7, 0x15, 0xb8, 0x03, 0xc5, 0x2e, 0x09,
0xbb, 0x31, 0xa5, 0x38, 0xec, 0x8e, 0xf4, 0xbc, 0x32, 0x21, 0x21, 0x21, 0x3f, 0xbe, 0x54, 0xea,
0xf5, 0x17, 0x9b, 0x09, 0xd9, 0x5f, 0x42, 0x25, 0x51, 0xaa, 0x5d, 0x78, 0x04, 0x8b, 0x78, 0x38,
0x49, 0x7d, 0xa5, 0x9d, 0xfc, 0x63, 0xe1, 0x48, 0xa0, 0x8e, 0x62, 0xea, 0xd7, 0x89, 0x13, 0x8a,
0x8f, 0x29, 0x19, 0xa4, 0xfc, 0xb2, 0xf7, 0x61, 0x23, 0x83, 0x77, 0x1b, 0xf5, 0x4f, 0x3f, 0xfd,
0xa9, 0x3d, 0xf4, 0x39, 0x66, 0xac, 0xed, 0x93, 0x5d, 0xf5, 0x6b, 0xb7, 0x47, 0x76, 0x87, 0x7c,
0x57, 0xfe, 0x7b, 0x63, 0x77, 0xe6, 0xab, 0xa9, 0xb3, 0x24, 0x19, 0x9f, 0xff, 0x27, 0x00, 0x00,
0xff, 0xff, 0x62, 0x6b, 0xcc, 0xed, 0x68, 0x19, 0x00, 0x00,
0x15, 0x06, 0x49, 0x49, 0xa6, 0x0e, 0x2f, 0x22, 0x97, 0x94, 0x48, 0xc9, 0x8d, 0x2e, 0x6b, 0xa7,
0x51, 0x5d, 0x94, 0x4a, 0x94, 0x34, 0x08, 0x52, 0xa4, 0xa8, 0xac, 0x8b, 0xed, 0x44, 0x89, 0x95,
0x95, 0x65, 0x17, 0x41, 0x81, 0xc5, 0x90, 0x3b, 0x22, 0x17, 0x5a, 0xee, 0xac, 0x67, 0x66, 0x29,
0xf1, 0x4f, 0xf4, 0x17, 0xf4, 0xad, 0x40, 0xfb, 0xde, 0xc7, 0xfe, 0x10, 0xf7, 0xa7, 0xf4, 0xa1,
0x0f, 0x2d, 0xe6, 0xb2, 0xe4, 0x2c, 0x49, 0xc9, 0x92, 0xe0, 0x02, 0x79, 0x11, 0x38, 0xdf, 0x39,
0x73, 0x6e, 0x73, 0x6e, 0x0b, 0x41, 0x83, 0xa3, 0x76, 0x80, 0x79, 0x1f, 0x85, 0xa8, 0x8b, 0xa9,
0x87, 0x38, 0x6a, 0x45, 0x94, 0x70, 0x62, 0x55, 0xa7, 0x08, 0x6b, 0x85, 0xb7, 0x31, 0xa6, 0x43,
0x45, 0x5f, 0x2b, 0x73, 0x12, 0x91, 0x31, 0xff, 0xda, 0x32, 0xc5, 0x51, 0xe0, 0x77, 0x10, 0xf7,
0x49, 0x68, 0xc0, 0xa5, 0x80, 0x74, 0x63, 0xee, 0x07, 0xea, 0x68, 0xff, 0x37, 0x03, 0x4b, 0xaf,
0x84, 0xe0, 0x03, 0x7c, 0xee, 0x87, 0xbe, 0x60, 0xb6, 0x2c, 0x98, 0x0b, 0x51, 0x1f, 0x37, 0x33,
0x9b, 0x99, 0xed, 0x45, 0x47, 0xfe, 0xb6, 0x56, 0x60, 0x81, 0x75, 0x7a, 0xb8, 0x8f, 0x9a, 0x59,
0x89, 0xea, 0x93, 0xd5, 0x84, 0x07, 0x1d, 0x12, 0xc4, 0xfd, 0x90, 0x35, 0x73, 0x9b, 0xb9, 0xed,
0x45, 0x27, 0x39, 0x5a, 0x2d, 0xa8, 0x45, 0xd4, 0xef, 0x23, 0x3a, 0x74, 0x2f, 0xf0, 0xd0, 0x4d,
0xb8, 0xe6, 0x24, 0x57, 0x55, 0x93, 0xbe, 0xc3, 0xc3, 0x7d, 0xcd, 0x6f, 0xc1, 0x1c, 0x1f, 0x46,
0xb8, 0x39, 0xaf, 0xb4, 0x8a, 0xdf, 0xd6, 0x06, 0x14, 0x84, 0xe9, 0x6e, 0x80, 0xc3, 0x2e, 0xef,
0x35, 0x17, 0x36, 0x33, 0xdb, 0x73, 0x0e, 0x08, 0xe8, 0x58, 0x22, 0xd6, 0x43, 0x58, 0xa4, 0xe4,
0xd2, 0xed, 0x90, 0x38, 0xe4, 0xcd, 0x07, 0x92, 0x9c, 0xa7, 0xe4, 0x72, 0x5f, 0x9c, 0xad, 0xc7,
0xb0, 0x70, 0xee, 0xe3, 0xc0, 0x63, 0xcd, 0xfc, 0x66, 0x6e, 0xbb, 0xb0, 0x5b, 0x6c, 0xa9, 0x78,
0x1d, 0x09, 0xd0, 0xd1, 0x34, 0xfb, 0x6f, 0x19, 0xa8, 0x9c, 0x4a, 0x67, 0x8c, 0x10, 0x7c, 0x02,
0x4b, 0x42, 0x4b, 0x1b, 0x31, 0xec, 0x6a, 0xbf, 0x55, 0x34, 0xca, 0x09, 0xac, 0xae, 0x58, 0x2f,
0x41, 0xbd, 0x8b, 0xeb, 0x8d, 0x2e, 0xb3, 0x66, 0x56, 0xaa, 0xb3, 0x5b, 0xd3, 0x4f, 0x39, 0x11,
0x6a, 0xa7, 0xc2, 0xd3, 0x00, 0x13, 0x01, 0x1d, 0x60, 0xca, 0x7c, 0x12, 0x36, 0x73, 0x52, 0x63,
0x72, 0x14, 0x86, 0x5a, 0x4a, 0xeb, 0x7e, 0x0f, 0x85, 0x5d, 0xec, 0x60, 0x16, 0x07, 0xdc, 0x7a,
0x0e, 0xa5, 0x36, 0x3e, 0x27, 0x34, 0x65, 0x68, 0x61, 0xf7, 0xd1, 0x0c, 0xed, 0x93, 0x6e, 0x3a,
0x45, 0x75, 0x53, 0xfb, 0x72, 0x04, 0x45, 0x74, 0xce, 0x31, 0x75, 0x8d, 0x97, 0xbe, 0xa5, 0xa0,
0x82, 0xbc, 0xa8, 0x60, 0xfb, 0xdf, 0x19, 0x28, 0x9f, 0x31, 0x4c, 0x4f, 0x30, 0xed, 0xfb, 0x8c,
0xe9, 0x94, 0xea, 0x11, 0xc6, 0x93, 0x94, 0x12, 0xbf, 0x05, 0x16, 0x33, 0x4c, 0x75, 0x42, 0xc9,
0xdf, 0xd6, 0xaf, 0xa1, 0x1a, 0x21, 0xc6, 0x2e, 0x09, 0xf5, 0xdc, 0x4e, 0x0f, 0x77, 0x2e, 0x58,
0xdc, 0x97, 0x71, 0x98, 0x73, 0x2a, 0x09, 0x61, 0x5f, 0xe3, 0xd6, 0x8f, 0x00, 0x11, 0xf5, 0x07,
0x7e, 0x80, 0xbb, 0x58, 0x25, 0x56, 0x61, 0xf7, 0xb3, 0x19, 0xd6, 0xa6, 0x6d, 0x69, 0x9d, 0x8c,
0xee, 0x1c, 0x86, 0x9c, 0x0e, 0x1d, 0x43, 0xc8, 0xda, 0x37, 0xb0, 0x34, 0x41, 0xb6, 0x2a, 0x90,
0xbb, 0xc0, 0x43, 0x6d, 0xb9, 0xf8, 0x69, 0xd5, 0x61, 0x7e, 0x80, 0x82, 0x18, 0x6b, 0xcb, 0xd5,
0xe1, 0xeb, 0xec, 0x57, 0x19, 0xfb, 0x5d, 0x06, 0x8a, 0x07, 0xed, 0xf7, 0xf8, 0x5d, 0x86, 0xac,
0xd7, 0xd6, 0x77, 0xb3, 0x5e, 0x7b, 0x14, 0x87, 0x9c, 0x11, 0x87, 0x97, 0x33, 0x5c, 0xdb, 0x99,
0xe1, 0x9a, 0xa9, 0xec, 0xff, 0xe9, 0xd8, 0x5f, 0x33, 0x50, 0x18, 0x6b, 0x62, 0xd6, 0x31, 0x54,
0x84, 0x9d, 0x6e, 0x34, 0xc6, 0x9a, 0x19, 0x69, 0xe5, 0xd6, 0x7b, 0x1f, 0xc0, 0x59, 0x8a, 0x53,
0x67, 0x66, 0x1d, 0x41, 0xd9, 0x6b, 0xa7, 0x64, 0xa9, 0x0a, 0xda, 0x78, 0x8f, 0xc7, 0x4e, 0xc9,
0x33, 0x4e, 0xcc, 0xfe, 0x04, 0x0a, 0x27, 0x7e, 0xd8, 0x75, 0xf0, 0xdb, 0x18, 0x33, 0x2e, 0x4a,
0x29, 0x42, 0xc3, 0x80, 0x20, 0x4f, 0x3b, 0x99, 0x1c, 0xed, 0x6d, 0x28, 0x2a, 0x46, 0x16, 0x91,
0x90, 0xe1, 0x1b, 0x38, 0x9f, 0x40, 0xf1, 0x34, 0xc0, 0x38, 0x4a, 0x64, 0xae, 0x41, 0xde, 0x8b,
0xa9, 0x6c, 0xaa, 0x92, 0x35, 0xe7, 0x8c, 0xce, 0xf6, 0x12, 0x94, 0x34, 0xaf, 0x12, 0x6b, 0xff,
0x2b, 0x03, 0xd6, 0xe1, 0x15, 0xee, 0xc4, 0x1c, 0x3f, 0x27, 0xe4, 0x22, 0x91, 0x31, 0xab, 0xbf,
0xae, 0x03, 0x44, 0x88, 0xa2, 0x3e, 0xe6, 0x98, 0x2a, 0xf7, 0x17, 0x1d, 0x03, 0xb1, 0x4e, 0x60,
0x11, 0x5f, 0x71, 0x8a, 0x5c, 0x1c, 0x0e, 0x64, 0xa7, 0x2d, 0xec, 0x7e, 0x3e, 0x23, 0x3a, 0xd3,
0xda, 0x5a, 0x87, 0xe2, 0xda, 0x61, 0x38, 0x50, 0x39, 0x91, 0xc7, 0xfa, 0xb8, 0xf6, 0x3b, 0x28,
0xa5, 0x48, 0x77, 0xca, 0x87, 0x73, 0xa8, 0xa5, 0x54, 0xe9, 0x38, 0x6e, 0x40, 0x01, 0x5f, 0xf9,
0xdc, 0x65, 0x1c, 0xf1, 0x98, 0xe9, 0x00, 0x81, 0x80, 0x4e, 0x25, 0x22, 0xc7, 0x08, 0xf7, 0x48,
0xcc, 0x47, 0x63, 0x44, 0x9e, 0x34, 0x8e, 0x69, 0x52, 0x05, 0xfa, 0x64, 0x0f, 0xa0, 0xf2, 0x0c,
0x73, 0xd5, 0x57, 0x92, 0xf0, 0xad, 0xc0, 0x82, 0x74, 0x5c, 0x65, 0xdc, 0xa2, 0xa3, 0x4f, 0xd6,
0x23, 0x28, 0xf9, 0x61, 0x27, 0x88, 0x3d, 0xec, 0x0e, 0x7c, 0x7c, 0xc9, 0xa4, 0x8a, 0xbc, 0x53,
0xd4, 0xe0, 0x6b, 0x81, 0x59, 0x1f, 0x43, 0x19, 0x5f, 0x29, 0x26, 0x2d, 0x44, 0x8d, 0xad, 0x92,
0x46, 0x65, 0x83, 0x66, 0x36, 0x86, 0xaa, 0xa1, 0x57, 0x7b, 0x77, 0x02, 0x55, 0xd5, 0x19, 0x8d,
0x66, 0x7f, 0x97, 0x6e, 0x5b, 0x61, 0x13, 0x88, 0xdd, 0x80, 0xe5, 0x67, 0x98, 0x1b, 0x29, 0xac,
0x7d, 0xb4, 0x7f, 0x82, 0x95, 0x49, 0x82, 0x36, 0xe2, 0x0f, 0x50, 0x48, 0x17, 0x9d, 0x50, 0xbf,
0x3e, 0x43, 0xbd, 0x79, 0xd9, 0xbc, 0x62, 0xd7, 0xc1, 0x3a, 0xc5, 0xdc, 0xc1, 0xc8, 0x7b, 0x19,
0x06, 0xc3, 0x44, 0xe3, 0x32, 0xd4, 0x52, 0xa8, 0x4e, 0xe1, 0x31, 0xfc, 0x86, 0xfa, 0x1c, 0x27,
0xdc, 0x2b, 0x50, 0x4f, 0xc3, 0x9a, 0xfd, 0x5b, 0xa8, 0xaa, 0xe1, 0xf4, 0x6a, 0x18, 0x25, 0xcc,
0xd6, 0x6f, 0xa1, 0xa0, 0xcc, 0x73, 0xe5, 0x80, 0x17, 0x26, 0x97, 0x77, 0xeb, 0xad, 0xd1, 0xbe,
0x22, 0x63, 0xce, 0xe5, 0x0d, 0xe0, 0xa3, 0xdf, 0xc2, 0x4e, 0x53, 0xd6, 0xd8, 0x20, 0x07, 0x9f,
0x53, 0xcc, 0x7a, 0x22, 0xa5, 0x4c, 0x83, 0xd2, 0xb0, 0x66, 0x6f, 0xc0, 0xb2, 0x13, 0x87, 0xcf,
0x31, 0x0a, 0x78, 0x4f, 0x0e, 0x8e, 0xe4, 0x42, 0x13, 0x56, 0x26, 0x09, 0xfa, 0xca, 0x17, 0xd0,
0x7c, 0xd1, 0x0d, 0x09, 0xc5, 0x8a, 0x78, 0x48, 0x29, 0xa1, 0xa9, 0x96, 0xc2, 0x39, 0xa6, 0xe1,
0xb8, 0x51, 0xc8, 0xa3, 0xfd, 0x10, 0x56, 0x67, 0xdc, 0xd2, 0x22, 0xbf, 0x16, 0x46, 0x8b, 0x7e,
0x92, 0xce, 0xe4, 0x47, 0x50, 0xba, 0x44, 0x3e, 0x77, 0x23, 0xc2, 0xc6, 0xc9, 0xb4, 0xe8, 0x14,
0x05, 0x78, 0xa2, 0x31, 0xe5, 0x99, 0x79, 0x57, 0xcb, 0xdc, 0x85, 0x95, 0x13, 0x8a, 0xcf, 0x03,
0xbf, 0xdb, 0x9b, 0x28, 0x10, 0xb1, 0x93, 0xc9, 0xc0, 0x25, 0x15, 0x92, 0x1c, 0xed, 0x2e, 0x34,
0xa6, 0xee, 0xe8, 0xbc, 0x3a, 0x86, 0xb2, 0xe2, 0x72, 0xa9, 0xdc, 0x2b, 0x92, 0x7e, 0xfe, 0xf1,
0xb5, 0x99, 0x6d, 0x6e, 0x21, 0x4e, 0xa9, 0x63, 0x9c, 0x98, 0xfd, 0x9f, 0x0c, 0x58, 0x7b, 0x51,
0x14, 0x0c, 0xd3, 0x96, 0x55, 0x20, 0xc7, 0xde, 0x06, 0x49, 0x8b, 0x61, 0x6f, 0x03, 0xd1, 0x62,
0xce, 0x09, 0xed, 0x60, 0x5d, 0xac, 0xea, 0x20, 0xd6, 0x00, 0x14, 0x04, 0xe4, 0xd2, 0x35, 0x76,
0x58, 0xd9, 0x19, 0xf2, 0x4e, 0x45, 0x12, 0x9c, 0x31, 0x3e, 0xbd, 0x00, 0xcd, 0x7d, 0xa8, 0x05,
0x68, 0xfe, 0x9e, 0x0b, 0xd0, 0xdf, 0x33, 0x50, 0x4b, 0x79, 0xaf, 0x63, 0xfc, 0xf3, 0x5b, 0xd5,
0x6a, 0x50, 0x3d, 0x26, 0x9d, 0x0b, 0xd5, 0xf5, 0x92, 0xd2, 0xa8, 0x83, 0x65, 0x82, 0xe3, 0xc2,
0x3b, 0x0b, 0x83, 0x29, 0xe6, 0x15, 0xa8, 0xa7, 0x61, 0xcd, 0xfe, 0x8f, 0x0c, 0x34, 0xf5, 0x88,
0x38, 0xc2, 0xbc, 0xd3, 0xdb, 0x63, 0x07, 0xed, 0x51, 0x1e, 0xd4, 0x61, 0x5e, 0xae, 0xe2, 0x32,
0x00, 0x45, 0x47, 0x1d, 0xac, 0x06, 0x3c, 0xf0, 0xda, 0xae, 0x1c, 0x8d, 0x7a, 0x3a, 0x78, 0xed,
0x1f, 0xc4, 0x70, 0x5c, 0x85, 0x7c, 0x1f, 0x5d, 0xb9, 0x94, 0x5c, 0x32, 0xbd, 0x0c, 0x3e, 0xe8,
0xa3, 0x2b, 0x87, 0x5c, 0x32, 0xb9, 0xa8, 0xfb, 0x4c, 0x6e, 0xe0, 0x6d, 0x3f, 0x0c, 0x48, 0x97,
0xc9, 0xe7, 0xcf, 0x3b, 0x65, 0x0d, 0x3f, 0x55, 0xa8, 0xa8, 0x35, 0x2a, 0xcb, 0xc8, 0x7c, 0xdc,
0xbc, 0x53, 0xa4, 0x46, 0x6d, 0xd9, 0xcf, 0x60, 0x75, 0x86, 0xcd, 0xfa, 0xf5, 0x9e, 0xc0, 0x82,
0x2a, 0x0d, 0xfd, 0x6c, 0x96, 0xfe, 0x9c, 0xf8, 0x51, 0xfc, 0xd5, 0x65, 0xa0, 0x39, 0xec, 0x3f,
0x67, 0xe0, 0xa3, 0xb4, 0xa4, 0xbd, 0x20, 0x10, 0x0b, 0x18, 0xfb, 0xf0, 0x21, 0x98, 0xf2, 0x6c,
0x6e, 0x86, 0x67, 0xc7, 0xb0, 0x7e, 0x9d, 0x3d, 0xf7, 0x70, 0xef, 0xbb, 0xc9, 0xb7, 0xdd, 0x8b,
0xa2, 0x9b, 0x1d, 0x33, 0xed, 0xcf, 0xa6, 0xec, 0x9f, 0x0e, 0xba, 0x14, 0x76, 0x0f, 0xab, 0xc4,
0x60, 0x0b, 0xd0, 0x00, 0xab, 0x5d, 0x23, 0x49, 0xd0, 0x23, 0xa8, 0xa5, 0x50, 0x2d, 0x78, 0x47,
0x6c, 0x1c, 0xa3, 0x2d, 0xa5, 0xb0, 0xdb, 0x68, 0x4d, 0x7e, 0x2f, 0xeb, 0x0b, 0x9a, 0x4d, 0x4c,
0x92, 0xef, 0x11, 0xe3, 0x98, 0x26, 0x9d, 0x39, 0x51, 0xf0, 0x05, 0xac, 0x4c, 0x12, 0xb4, 0x8e,
0x35, 0xc8, 0x4f, 0xb4, 0xf6, 0xd1, 0x59, 0xdc, 0x7a, 0x83, 0x7c, 0x7e, 0x44, 0x26, 0xe5, 0xdd,
0x78, 0x6b, 0x15, 0x1a, 0x53, 0xb7, 0x74, 0xc1, 0x59, 0x50, 0x39, 0xe5, 0x24, 0x92, 0xbe, 0x26,
0xa6, 0xd5, 0xa0, 0x6a, 0x60, 0x9a, 0xf1, 0x8f, 0xd0, 0x18, 0x81, 0xdf, 0xfb, 0xa1, 0xdf, 0x8f,
0xfb, 0xb7, 0x50, 0x6d, 0x6d, 0x81, 0x9c, 0x4b, 0x2e, 0xf7, 0xfb, 0x38, 0x59, 0xe0, 0x72, 0x4e,
0x41, 0x60, 0xaf, 0x14, 0x64, 0x7f, 0x09, 0xcd, 0x69, 0xc9, 0xb7, 0x88, 0x85, 0x34, 0x13, 0x51,
0x9e, 0xb2, 0x5d, 0xbc, 0xa6, 0x01, 0x6a, 0xe3, 0xff, 0x04, 0x0f, 0xc7, 0xe8, 0x59, 0xc8, 0xfd,
0x60, 0x4f, 0xb4, 0xb3, 0x0f, 0xe4, 0xc0, 0x3a, 0xfc, 0x62, 0xb6, 0x74, 0xad, 0xfd, 0x00, 0xb6,
0xd4, 0xb2, 0x72, 0x78, 0x25, 0x86, 0x3e, 0x0a, 0xc4, 0xa6, 0x14, 0x21, 0x8a, 0x43, 0x8e, 0xbd,
0xc4, 0x06, 0xb9, 0x04, 0x2b, 0xb2, 0xeb, 0x27, 0x1f, 0x14, 0x90, 0x40, 0x2f, 0x3c, 0xfb, 0x31,
0xd8, 0x37, 0x49, 0xd1, 0xba, 0x36, 0x61, 0x7d, 0x92, 0xeb, 0x30, 0xc0, 0x9d, 0xb1, 0x22, 0x7b,
0x0b, 0x36, 0xae, 0xe5, 0x18, 0x27, 0x85, 0xd8, 0x63, 0x85, 0x3b, 0xa3, 0x82, 0xf8, 0x95, 0xda,
0x6d, 0x35, 0xa6, 0x9f, 0xa7, 0x0e, 0xf3, 0xc8, 0xf3, 0x68, 0xb2, 0x31, 0xa8, 0x83, 0x48, 0x37,
0x07, 0x33, 0xb1, 0xe8, 0x8d, 0x4a, 0x23, 0x91, 0xb2, 0x06, 0xcd, 0x69, 0x92, 0xd6, 0xba, 0x03,
0x8d, 0xd7, 0x06, 0x2e, 0xaa, 0x7b, 0x66, 0x77, 0x58, 0xd4, 0xdd, 0xc1, 0x3e, 0x82, 0xe6, 0xf4,
0x85, 0x7b, 0xf5, 0xa5, 0x8f, 0x4c, 0x39, 0xe3, 0x52, 0x49, 0xd4, 0x97, 0x21, 0xab, 0x9f, 0x24,
0xe7, 0x64, 0x7d, 0x2f, 0x95, 0x2f, 0xd9, 0x89, 0xac, 0xdc, 0x84, 0xf5, 0xeb, 0x84, 0x69, 0x3f,
0x6b, 0x50, 0x7d, 0x11, 0xfa, 0x5c, 0x55, 0x7f, 0x12, 0x98, 0x4f, 0xc1, 0x32, 0xc1, 0x5b, 0xa4,
0xff, 0xbb, 0x0c, 0xac, 0x9f, 0x90, 0x28, 0x0e, 0xe4, 0xe2, 0xaa, 0x12, 0xe1, 0x5b, 0x12, 0x8b,
0x17, 0x4d, 0xec, 0xfe, 0x25, 0x2c, 0x89, 0xb4, 0x75, 0x3b, 0x14, 0x23, 0x8e, 0x3d, 0x37, 0x4c,
0x3e, 0xae, 0x4a, 0x02, 0xde, 0x57, 0xe8, 0x0f, 0x4c, 0xe4, 0x1e, 0xea, 0x08, 0xa1, 0xe6, 0x0c,
0x01, 0x05, 0xc9, 0x39, 0xf2, 0x15, 0x14, 0xfb, 0xd2, 0x32, 0x17, 0x05, 0x3e, 0x52, 0xb3, 0xa4,
0xb0, 0xbb, 0x3c, 0xb9, 0x8c, 0xef, 0x09, 0xa2, 0x53, 0x50, 0xac, 0xf2, 0x60, 0x7d, 0x06, 0x75,
0xa3, 0x43, 0x8e, 0x77, 0xd6, 0x39, 0xa9, 0xa3, 0x66, 0xd0, 0x46, 0xab, 0xeb, 0x16, 0x6c, 0x5c,
0xeb, 0x97, 0x0e, 0xe1, 0x5f, 0x32, 0x50, 0x11, 0xe1, 0x32, 0x4b, 0xdf, 0xfa, 0x0d, 0x2c, 0x28,
0x6e, 0xfd, 0xe4, 0xd7, 0x98, 0xa7, 0x99, 0xae, 0xb5, 0x2c, 0x7b, 0xad, 0x65, 0xb3, 0xe2, 0x99,
0x9b, 0x11, 0xcf, 0xe4, 0x85, 0xd3, 0x3d, 0x68, 0x19, 0x6a, 0x07, 0xb8, 0x4f, 0x38, 0x4e, 0x3f,
0xfc, 0x2e, 0xd4, 0xd3, 0xf0, 0x2d, 0x9e, 0x7e, 0x15, 0x1a, 0x67, 0xa1, 0x47, 0x66, 0x89, 0x5b,
0x83, 0xe6, 0x34, 0x49, 0x5b, 0xf0, 0x0d, 0x6c, 0x9c, 0x50, 0x22, 0x08, 0xd2, 0xb2, 0x37, 0x3d,
0x1c, 0xee, 0xa3, 0xb8, 0xdb, 0xe3, 0x67, 0xd1, 0x6d, 0xa6, 0xc8, 0xef, 0x61, 0xf3, 0xfa, 0xeb,
0xb7, 0xb3, 0x5a, 0x5d, 0x44, 0x4c, 0xcb, 0xf1, 0x0c, 0xab, 0xa7, 0x49, 0xda, 0xea, 0x7f, 0x66,
0xa0, 0x72, 0x8a, 0xd3, 0xe5, 0x72, 0xd7, 0xb7, 0x9e, 0xf1, 0x70, 0xd9, 0x59, 0x85, 0x30, 0xf5,
0x69, 0x35, 0x37, 0xfd, 0x69, 0x65, 0x3d, 0x81, 0xaa, 0xfc, 0xde, 0x70, 0x99, 0x68, 0xfa, 0x2e,
0x13, 0x86, 0xeb, 0xcf, 0x8c, 0x25, 0x49, 0x18, 0x0f, 0x03, 0x39, 0xa3, 0xf0, 0x44, 0x55, 0xdb,
0x2f, 0xc6, 0xde, 0x3a, 0x58, 0x0a, 0x19, 0x8f, 0x81, 0xbb, 0x39, 0x26, 0xbe, 0x1f, 0x67, 0x88,
0xd2, 0x7a, 0x1e, 0x83, 0x2d, 0x06, 0xab, 0xd1, 0x8d, 0xf6, 0x42, 0x4f, 0x34, 0xf1, 0xd4, 0xa6,
0xf3, 0x1a, 0x1e, 0xdd, 0xc8, 0x75, 0xdf, 0xcd, 0x67, 0x19, 0x6a, 0x66, 0xba, 0x18, 0xf9, 0x9e,
0x86, 0x6f, 0x91, 0x39, 0xa7, 0x50, 0x7a, 0x8a, 0x3a, 0x17, 0xf1, 0x28, 0x4d, 0x37, 0xa1, 0xd0,
0x21, 0x61, 0x27, 0xa6, 0x14, 0x87, 0x9d, 0xa1, 0x6e, 0x6a, 0x26, 0x24, 0x38, 0xe4, 0x27, 0x9f,
0x0a, 0xbd, 0xfe, 0x4e, 0x34, 0x21, 0xfb, 0x4b, 0x28, 0x27, 0x42, 0xb5, 0x09, 0x8f, 0x61, 0x1e,
0x0f, 0xc6, 0xa1, 0x2f, 0xb7, 0x92, 0x7f, 0x7a, 0x1c, 0x0a, 0xd4, 0x51, 0x44, 0x3d, 0xc2, 0x38,
0xa1, 0xf8, 0x88, 0x92, 0x7e, 0xca, 0x2e, 0x7b, 0x0f, 0x56, 0x67, 0xd0, 0xee, 0x22, 0xfe, 0xe9,
0xa7, 0x3f, 0xb5, 0x06, 0x3e, 0xc7, 0x8c, 0xb5, 0x7c, 0xb2, 0xa3, 0x7e, 0xed, 0x74, 0xc9, 0xce,
0x80, 0xef, 0xc8, 0x7f, 0xbd, 0xec, 0x4c, 0x7d, 0xab, 0xb5, 0x17, 0x24, 0xe1, 0xf3, 0xff, 0x05,
0x00, 0x00, 0xff, 0xff, 0x05, 0x80, 0x1f, 0x06, 0x04, 0x1a, 0x00, 0x00,
}

Просмотреть файл

@ -6,11 +6,12 @@ package tabletmanagerservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
tabletmanagerdata "vitess.io/vitess/go/vt/proto/tabletmanagerdata"
)
@ -28,72 +29,73 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("tabletmanagerservice.proto", fileDescriptor_9ee75fe63cfd9360) }
var fileDescriptor_9ee75fe63cfd9360 = []byte{
// 1030 bytes of a gzipped FileDescriptorProto
// 1041 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x98, 0x6d, 0x6f, 0x1b, 0x45,
0x10, 0xc7, 0xb1, 0x04, 0x95, 0x58, 0x1e, 0xbb, 0xaa, 0x28, 0x0a, 0x12, 0x4f, 0x4d, 0x79, 0x48,
0x10, 0xc7, 0xb1, 0x04, 0x95, 0x58, 0x1e, 0xbb, 0xaa, 0x28, 0x0a, 0x12, 0x4f, 0x6d, 0x78, 0x48,
0x51, 0xdc, 0x34, 0x94, 0xf7, 0x6e, 0x9a, 0xb4, 0x41, 0x8d, 0x30, 0x76, 0x43, 0x10, 0x48, 0x48,
0x1b, 0x7b, 0xe2, 0x3b, 0x72, 0xde, 0x3d, 0x76, 0xf7, 0xac, 0xe6, 0x15, 0x12, 0x12, 0xaf, 0x90,
0xf8, 0x4a, 0x7c, 0x35, 0x74, 0x0f, 0xbb, 0x37, 0x6b, 0xcf, 0xad, 0xed, 0x77, 0x91, 0xff, 0xbf,
0x9d, 0x99, 0x9d, 0x9d, 0x99, 0xdd, 0x1c, 0xdb, 0xb1, 0xe2, 0x32, 0x03, 0x3b, 0x17, 0x52, 0xcc,
0x40, 0x1b, 0xd0, 0x8b, 0x74, 0x02, 0xfb, 0xb9, 0x56, 0x56, 0xf1, 0x3b, 0x94, 0xb6, 0x73, 0x37,
0xf8, 0x75, 0x2a, 0xac, 0xa8, 0xf1, 0x47, 0xff, 0xed, 0xb2, 0x77, 0x5e, 0x56, 0xda, 0x59, 0xad,
0xf1, 0x53, 0xf6, 0xfa, 0x30, 0x95, 0x33, 0xfe, 0xf1, 0xfe, 0xea, 0x9a, 0x52, 0x18, 0xc1, 0x1f,
0x05, 0x18, 0xbb, 0xf3, 0x49, 0xa7, 0x6e, 0x72, 0x25, 0x0d, 0x7c, 0xfe, 0x1a, 0x7f, 0xc1, 0xde,
0x18, 0x67, 0x00, 0x39, 0xa7, 0xd8, 0x4a, 0x71, 0xc6, 0x3e, 0xed, 0x06, 0xbc, 0xb5, 0xdf, 0xd8,
0x5b, 0xc7, 0xaf, 0x60, 0x52, 0x58, 0x78, 0xae, 0xd4, 0x35, 0xbf, 0x4f, 0x2c, 0x41, 0xba, 0xb3,
0xfc, 0xc5, 0x3a, 0xcc, 0xdb, 0xff, 0x99, 0xbd, 0xf9, 0x0c, 0xec, 0x78, 0x92, 0xc0, 0x5c, 0xf0,
0x7b, 0xc4, 0x32, 0xaf, 0x3a, 0xdb, 0xbb, 0x71, 0xc8, 0x5b, 0x9e, 0xb1, 0x77, 0x9f, 0x81, 0x1d,
0x82, 0x9e, 0xa7, 0xc6, 0xa4, 0x4a, 0x1a, 0xfe, 0x15, 0xbd, 0x12, 0x21, 0xce, 0xc7, 0xd7, 0x1b,
0x90, 0x38, 0x45, 0x63, 0xb0, 0x23, 0x10, 0xd3, 0x1f, 0x64, 0x76, 0x43, 0xa6, 0x08, 0xe9, 0xb1,
0x14, 0x05, 0x98, 0xb7, 0x2f, 0xd8, 0xdb, 0x8d, 0x70, 0xa1, 0x53, 0x0b, 0x3c, 0xb2, 0xb2, 0x02,
0x9c, 0x87, 0x2f, 0xd7, 0x72, 0xde, 0xc5, 0xaf, 0x8c, 0x1d, 0x25, 0x42, 0xce, 0xe0, 0xe5, 0x4d,
0x0e, 0x9c, 0xca, 0x70, 0x2b, 0x3b, 0xf3, 0xf7, 0xd7, 0x50, 0x38, 0xfe, 0x11, 0x5c, 0x69, 0x30,
0xc9, 0xd8, 0x8a, 0x8e, 0xf8, 0x31, 0x10, 0x8b, 0x3f, 0xe4, 0xf0, 0x59, 0x8f, 0x0a, 0xf9, 0x1c,
0x44, 0x66, 0x93, 0xa3, 0x04, 0x26, 0xd7, 0xe4, 0x59, 0x87, 0x48, 0xec, 0xac, 0x97, 0x49, 0xef,
0x28, 0x67, 0xb7, 0x4f, 0x67, 0x52, 0x69, 0xa8, 0xe5, 0x63, 0xad, 0x95, 0xe6, 0x0f, 0x08, 0x0b,
0x2b, 0x94, 0x73, 0xf7, 0xcd, 0x66, 0x70, 0x98, 0xbd, 0x4c, 0x89, 0x69, 0xd3, 0x23, 0x74, 0xf6,
0x5a, 0x20, 0x9e, 0x3d, 0xcc, 0x79, 0x17, 0xbf, 0xb3, 0xf7, 0x86, 0x1a, 0xae, 0xb2, 0x74, 0x96,
0xb8, 0x4e, 0xa4, 0x92, 0xb2, 0xc4, 0x38, 0x47, 0x7b, 0x9b, 0xa0, 0xb8, 0x59, 0x06, 0x79, 0x9e,
0xdd, 0x34, 0x7e, 0xa8, 0x22, 0x42, 0x7a, 0xac, 0x59, 0x02, 0x0c, 0x57, 0xf2, 0x0b, 0x35, 0xb9,
0xae, 0xa6, 0xab, 0x21, 0x2b, 0xb9, 0x95, 0x63, 0x95, 0x8c, 0x29, 0x7c, 0x16, 0xe7, 0x32, 0x6b,
0xcd, 0x53, 0x61, 0x61, 0x20, 0x76, 0x16, 0x21, 0x87, 0x0b, 0xac, 0x19, 0x94, 0x27, 0x60, 0x27,
0xc9, 0xc0, 0x3c, 0xbd, 0x14, 0x64, 0x81, 0xad, 0x50, 0xb1, 0x02, 0x23, 0x60, 0xef, 0xf1, 0x4f,
0xf6, 0x41, 0x28, 0x0f, 0xb2, 0x6c, 0xa8, 0xd3, 0x85, 0xe1, 0x0f, 0xd7, 0x5a, 0x72, 0xa8, 0xf3,
0x7d, 0xb0, 0xc5, 0x8a, 0xee, 0x2d, 0x0f, 0xf2, 0x7c, 0x83, 0x2d, 0x0f, 0xf2, 0x7c, 0xf3, 0x2d,
0x57, 0x70, 0x30, 0xb1, 0x33, 0xb1, 0x80, 0x72, 0x8c, 0x14, 0x86, 0x9e, 0xd8, 0xad, 0x1e, 0x9d,
0xd8, 0x18, 0xc3, 0xe3, 0xe8, 0x4c, 0x18, 0x0b, 0x7a, 0xa8, 0x4c, 0x6a, 0x53, 0x25, 0xc9, 0x71,
0x14, 0x22, 0xb1, 0x71, 0xb4, 0x4c, 0xe2, 0xdb, 0x73, 0x6c, 0x55, 0x5e, 0x45, 0x41, 0xde, 0x9e,
0x5e, 0x8d, 0xdd, 0x9e, 0x08, 0xf2, 0x96, 0xe7, 0xec, 0x7d, 0xff, 0xf3, 0x59, 0x2a, 0xd3, 0x79,
0x31, 0xe7, 0x7b, 0xb1, 0xb5, 0x0d, 0xe4, 0xfc, 0x3c, 0xd8, 0x88, 0xc5, 0x6d, 0x3b, 0xb6, 0x42,
0xdb, 0x7a, 0x27, 0x74, 0x90, 0x4e, 0x8e, 0xb5, 0x2d, 0xa6, 0xbc, 0xf1, 0x1b, 0x76, 0xa7, 0xfd,
0xfd, 0x5c, 0xda, 0x34, 0x1b, 0x5c, 0x59, 0xd0, 0x7c, 0x3f, 0x6a, 0xa0, 0x05, 0x9d, 0xc3, 0xfe,
0xc6, 0xbc, 0x77, 0xfd, 0x4f, 0x8f, 0xed, 0xd4, 0x2f, 0xbd, 0xe3, 0x57, 0x16, 0xb4, 0x14, 0x59,
0x79, 0xb5, 0xe7, 0x42, 0x83, 0xb4, 0x30, 0xe5, 0xdf, 0x12, 0x16, 0xbb, 0x71, 0x17, 0xc7, 0xe3,
0x2d, 0x57, 0xf9, 0x68, 0xfe, 0xea, 0xb1, 0xbb, 0xcb, 0xe0, 0x71, 0x06, 0x93, 0x32, 0x94, 0x83,
0x0d, 0x8c, 0x36, 0xac, 0x8b, 0xe3, 0xd1, 0x36, 0x4b, 0x96, 0x5f, 0x7c, 0x65, 0xca, 0x4c, 0xe7,
0x8b, 0xaf, 0x52, 0xd7, 0xbd, 0xf8, 0x1a, 0x08, 0xd7, 0xec, 0x4f, 0x23, 0xc8, 0xb3, 0x74, 0x22,
0xca, 0x3e, 0x29, 0x27, 0x00, 0x59, 0xb3, 0xcb, 0x50, 0xac, 0x66, 0x57, 0x59, 0x3c, 0x38, 0xb1,
0x7a, 0x21, 0x52, 0x7b, 0xa2, 0xca, 0x2e, 0x25, 0x07, 0x27, 0x8d, 0xc6, 0x06, 0x67, 0xd7, 0x0a,
0xbc, 0xdf, 0x11, 0x98, 0xf2, 0x45, 0xe7, 0x39, 0x72, 0xbf, 0xcb, 0x50, 0x6c, 0xbf, 0xab, 0x2c,
0xee, 0xd1, 0x53, 0x99, 0xda, 0x7a, 0x18, 0x91, 0x3d, 0xda, 0xca, 0xb1, 0x1e, 0xc5, 0x54, 0x50,
0x9a, 0x43, 0x95, 0x17, 0x59, 0xf5, 0xb0, 0xab, 0x6b, 0xf7, 0x7b, 0x55, 0x94, 0x45, 0x44, 0x96,
0x66, 0x07, 0x1b, 0x2b, 0xcd, 0xce, 0x25, 0xb8, 0x34, 0xcb, 0xe0, 0xba, 0xc7, 0xa9, 0x57, 0x63,
0xa5, 0x89, 0x20, 0xfc, 0x72, 0x78, 0x0a, 0x73, 0x65, 0xa1, 0xc9, 0x1e, 0x75, 0x97, 0x60, 0x20,
0xf6, 0x72, 0x08, 0x39, 0x5c, 0x0d, 0xe7, 0x72, 0xaa, 0x02, 0x37, 0x7b, 0xe4, 0xc3, 0x23, 0x84,
0x62, 0xd5, 0xb0, 0xca, 0x7a, 0x77, 0x7f, 0xf7, 0xd8, 0x87, 0x43, 0xad, 0x4a, 0xad, 0xda, 0xec,
0x45, 0x02, 0xf2, 0x48, 0x14, 0xb3, 0xc4, 0x9e, 0xe7, 0x9c, 0x4c, 0x7f, 0x07, 0xec, 0xfc, 0x1f,
0x6e, 0xb5, 0x26, 0xb8, 0xa8, 0x2a, 0x59, 0x98, 0x86, 0x9e, 0xd2, 0x17, 0xd5, 0x12, 0x14, 0xbd,
0xa8, 0x56, 0xd8, 0xe0, 0xc6, 0x05, 0xd7, 0x03, 0xf7, 0xe8, 0xff, 0xb0, 0xc2, 0xbc, 0xee, 0xc6,
0x21, 0xfc, 0x0c, 0x72, 0x7e, 0x47, 0x60, 0xca, 0x6b, 0x05, 0xa6, 0x3c, 0x16, 0x9d, 0xa7, 0x62,
0xcf, 0x20, 0x02, 0xf6, 0x1e, 0xff, 0xed, 0xb1, 0x8f, 0xca, 0x3b, 0x19, 0xb5, 0xfb, 0x40, 0x4e,
0xcb, 0xc9, 0x5a, 0xbf, 0x8b, 0x1e, 0x77, 0xdc, 0xe1, 0x1d, 0xbc, 0x0b, 0xe3, 0xbb, 0x6d, 0x97,
0xe1, 0x2e, 0xc1, 0x27, 0x4e, 0x76, 0x09, 0x06, 0x62, 0x5d, 0x12, 0x72, 0xde, 0xc5, 0x8f, 0xec,
0xd6, 0x13, 0x31, 0xb9, 0x2e, 0x72, 0x4e, 0x7d, 0xfd, 0xa8, 0x25, 0x67, 0xf6, 0xb3, 0x08, 0xe1,
0x0c, 0x3e, 0xec, 0x71, 0xcd, 0x6e, 0x97, 0xd9, 0x55, 0x1a, 0x4e, 0xb4, 0x9a, 0x37, 0xd6, 0x3b,
0x66, 0x6b, 0x48, 0xc5, 0x0e, 0x8e, 0x80, 0x5b, 0x9f, 0x4f, 0x0e, 0x7f, 0x39, 0x58, 0xa4, 0x16,
0x8c, 0xd9, 0x4f, 0x55, 0xbf, 0xfe, 0xab, 0x3f, 0x53, 0xfd, 0x85, 0xed, 0x57, 0x5f, 0x98, 0xfa,
0xd4, 0xf7, 0xa8, 0xcb, 0x5b, 0x95, 0x76, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xae, 0x75,
0xbb, 0x5f, 0xca, 0x12, 0x00, 0x00,
0x1b, 0x7b, 0x62, 0x1f, 0x39, 0xef, 0x1e, 0xbb, 0x7b, 0x56, 0xf3, 0x0a, 0x09, 0x89, 0x57, 0x48,
0x7c, 0x11, 0xbe, 0x24, 0xba, 0x87, 0xdd, 0x9b, 0x3d, 0xcf, 0xad, 0xed, 0x77, 0x91, 0xff, 0xbf,
0x99, 0xd9, 0x87, 0x99, 0xd9, 0xc9, 0xb1, 0x1d, 0x2b, 0x2e, 0x53, 0xb0, 0x0b, 0x21, 0xc5, 0x0c,
0xb4, 0x01, 0xbd, 0x4c, 0x26, 0xb0, 0x9f, 0x69, 0x65, 0x15, 0xbf, 0x43, 0x69, 0x3b, 0x77, 0x83,
0x5f, 0xa7, 0xc2, 0x8a, 0x0a, 0x7f, 0xf4, 0xdf, 0x2e, 0x7b, 0xe7, 0x65, 0xa9, 0x9d, 0x55, 0x1a,
0x3f, 0x65, 0xaf, 0x0f, 0x13, 0x39, 0xe3, 0x1f, 0xef, 0xaf, 0xda, 0x14, 0xc2, 0x08, 0xfe, 0xc8,
0xc1, 0xd8, 0x9d, 0x4f, 0x3a, 0x75, 0x93, 0x29, 0x69, 0xe0, 0xf3, 0xd7, 0xf8, 0x0b, 0xf6, 0xc6,
0x38, 0x05, 0xc8, 0x38, 0xc5, 0x96, 0x8a, 0x73, 0xf6, 0x69, 0x37, 0xe0, 0xbd, 0xfd, 0xc6, 0xde,
0x3a, 0x7e, 0x05, 0x93, 0xdc, 0xc2, 0x73, 0xa5, 0xae, 0xf9, 0x2e, 0x61, 0x82, 0x74, 0xe7, 0xf9,
0x8b, 0x75, 0x98, 0xf7, 0xff, 0x33, 0x7b, 0xf3, 0x19, 0xd8, 0xf1, 0x64, 0x0e, 0x0b, 0xc1, 0xef,
0x11, 0x66, 0x5e, 0x75, 0xbe, 0xef, 0xc7, 0x21, 0xef, 0x79, 0xc6, 0xde, 0x7d, 0x06, 0x76, 0x08,
0x7a, 0x91, 0x18, 0x93, 0x28, 0x69, 0xf8, 0x57, 0xb4, 0x25, 0x42, 0x5c, 0x8c, 0xaf, 0x37, 0x20,
0xf1, 0x11, 0x8d, 0xc1, 0x8e, 0x40, 0x4c, 0x7f, 0x90, 0xe9, 0x0d, 0x79, 0x44, 0x48, 0x8f, 0x1d,
0x51, 0x80, 0x79, 0xff, 0x82, 0xbd, 0x5d, 0x0b, 0x17, 0x3a, 0xb1, 0xc0, 0x23, 0x96, 0x25, 0xe0,
0x22, 0x7c, 0xb9, 0x96, 0xf3, 0x21, 0x7e, 0x65, 0xec, 0x68, 0x2e, 0xe4, 0x0c, 0x5e, 0xde, 0x64,
0xc0, 0xa9, 0x13, 0x6e, 0x64, 0xe7, 0x7e, 0x77, 0x0d, 0x85, 0xd7, 0x3f, 0x82, 0x2b, 0x0d, 0x66,
0x3e, 0xb6, 0xa2, 0x63, 0xfd, 0x18, 0x88, 0xad, 0x3f, 0xe4, 0xf0, 0x5d, 0x8f, 0x72, 0xf9, 0x1c,
0x44, 0x6a, 0xe7, 0x47, 0x73, 0x98, 0x5c, 0x93, 0x77, 0x1d, 0x22, 0xb1, 0xbb, 0x6e, 0x93, 0x3e,
0x50, 0xc6, 0x6e, 0x9f, 0xce, 0xa4, 0xd2, 0x50, 0xc9, 0xc7, 0x5a, 0x2b, 0xcd, 0x1f, 0x10, 0x1e,
0x56, 0x28, 0x17, 0xee, 0x9b, 0xcd, 0xe0, 0xf0, 0xf4, 0x52, 0x25, 0xa6, 0x75, 0x8d, 0xd0, 0xa7,
0xd7, 0x00, 0xf1, 0xd3, 0xc3, 0x9c, 0x0f, 0xf1, 0x3b, 0x7b, 0x6f, 0xa8, 0xe1, 0x2a, 0x4d, 0x66,
0x73, 0x57, 0x89, 0xd4, 0xa1, 0xb4, 0x18, 0x17, 0x68, 0x6f, 0x13, 0x14, 0x17, 0xcb, 0x20, 0xcb,
0xd2, 0x9b, 0x3a, 0x0e, 0x95, 0x44, 0x48, 0x8f, 0x15, 0x4b, 0x80, 0xe1, 0x4c, 0x7e, 0xa1, 0x26,
0xd7, 0x65, 0x77, 0x35, 0x64, 0x26, 0x37, 0x72, 0x2c, 0x93, 0x31, 0x85, 0xef, 0xe2, 0x5c, 0xa6,
0x8d, 0x7b, 0x6a, 0x59, 0x18, 0x88, 0xdd, 0x45, 0xc8, 0xe1, 0x04, 0xab, 0x1b, 0xe5, 0x09, 0xd8,
0xc9, 0x7c, 0x60, 0x9e, 0x5e, 0x0a, 0x32, 0xc1, 0x56, 0xa8, 0x58, 0x82, 0x11, 0xb0, 0x8f, 0xf8,
0x27, 0xfb, 0x20, 0x94, 0x07, 0x69, 0x3a, 0xd4, 0xc9, 0xd2, 0xf0, 0x87, 0x6b, 0x3d, 0x39, 0xd4,
0xc5, 0x3e, 0xd8, 0xc2, 0xa2, 0x7b, 0xcb, 0x83, 0x2c, 0xdb, 0x60, 0xcb, 0x83, 0x2c, 0xdb, 0x7c,
0xcb, 0x25, 0x1c, 0x74, 0xec, 0x54, 0x2c, 0xa1, 0x68, 0x23, 0xb9, 0xa1, 0x3b, 0x76, 0xa3, 0x47,
0x3b, 0x36, 0xc6, 0x70, 0x3b, 0x3a, 0x13, 0xc6, 0x82, 0x1e, 0x2a, 0x93, 0xd8, 0x44, 0x49, 0xb2,
0x1d, 0x85, 0x48, 0xac, 0x1d, 0xb5, 0x49, 0x5c, 0xb9, 0x17, 0x22, 0xb1, 0x27, 0xaa, 0x89, 0x44,
0xd9, 0xb7, 0x98, 0x58, 0xe5, 0xae, 0xa0, 0xf8, 0xa5, 0x1e, 0x5b, 0x95, 0x95, 0x3b, 0x26, 0x5f,
0x6a, 0xaf, 0xc6, 0x5e, 0x6a, 0x04, 0x79, 0xcf, 0x0b, 0xf6, 0xbe, 0xff, 0xf9, 0x2c, 0x91, 0xc9,
0x22, 0x5f, 0xf0, 0xbd, 0x98, 0x6d, 0x0d, 0xb9, 0x38, 0x0f, 0x36, 0x62, 0x71, 0x8b, 0x18, 0x5b,
0xa1, 0x6d, 0xb5, 0x13, 0x7a, 0x91, 0x4e, 0x8e, 0xb5, 0x08, 0x4c, 0x79, 0xe7, 0x37, 0xec, 0x4e,
0xf3, 0xfb, 0xb9, 0xb4, 0x49, 0x3a, 0xb8, 0xb2, 0xa0, 0xf9, 0x7e, 0xd4, 0x41, 0x03, 0xba, 0x80,
0xfd, 0x8d, 0x79, 0x1f, 0xfa, 0x9f, 0x1e, 0xdb, 0xa9, 0xa6, 0xca, 0xe3, 0x57, 0x16, 0xb4, 0x14,
0x69, 0x31, 0x46, 0x64, 0x42, 0x83, 0xb4, 0x30, 0xe5, 0xdf, 0x12, 0x1e, 0xbb, 0x71, 0xb7, 0x8e,
0xc7, 0x5b, 0x5a, 0xf9, 0xd5, 0xfc, 0xd5, 0x63, 0x77, 0xdb, 0xe0, 0x71, 0x0a, 0x93, 0x62, 0x29,
0x07, 0x1b, 0x38, 0xad, 0x59, 0xb7, 0x8e, 0x47, 0xdb, 0x98, 0xb4, 0xa7, 0xcb, 0xe2, 0xc8, 0x4c,
0xe7, 0x74, 0x59, 0xaa, 0xeb, 0xa6, 0xcb, 0x1a, 0xc2, 0x39, 0xfb, 0xd3, 0x08, 0xb2, 0x34, 0x99,
0x88, 0xa2, 0x4e, 0x8a, 0x6e, 0x43, 0xe6, 0x6c, 0x1b, 0x8a, 0xe5, 0xec, 0x2a, 0x8b, 0x9b, 0x34,
0x56, 0x9b, 0x2a, 0x25, 0x9b, 0x34, 0x8d, 0xc6, 0x9a, 0x74, 0x97, 0x05, 0xde, 0xef, 0x08, 0x4c,
0x31, 0x3d, 0x7a, 0x8e, 0xdc, 0x6f, 0x1b, 0x8a, 0xed, 0x77, 0x95, 0xc5, 0x35, 0x7a, 0x2a, 0x13,
0x5b, 0x35, 0x3e, 0xb2, 0x46, 0x1b, 0x39, 0x56, 0xa3, 0x98, 0x0a, 0x52, 0x73, 0xa8, 0xb2, 0x3c,
0x2d, 0x87, 0xc8, 0x2a, 0x77, 0xbf, 0x57, 0x79, 0x91, 0x44, 0x64, 0x6a, 0x76, 0xb0, 0xb1, 0xd4,
0xec, 0x34, 0xc1, 0xa9, 0x59, 0x2c, 0xae, 0xbb, 0x9d, 0x7a, 0x35, 0x96, 0x9a, 0x08, 0xc2, 0x53,
0xca, 0x53, 0x58, 0x28, 0x0b, 0xf5, 0xe9, 0x51, 0xef, 0x16, 0x06, 0x62, 0x53, 0x4a, 0xc8, 0xe1,
0x6c, 0x38, 0x97, 0x53, 0x15, 0x84, 0xd9, 0x23, 0x87, 0x9c, 0x10, 0x8a, 0x65, 0xc3, 0x2a, 0xeb,
0xc3, 0xfd, 0xdd, 0x63, 0x1f, 0x0e, 0xb5, 0x2a, 0xb4, 0x72, 0xb3, 0x17, 0x73, 0x90, 0x47, 0x22,
0x9f, 0xcd, 0xed, 0x79, 0xc6, 0xc9, 0xe3, 0xef, 0x80, 0x5d, 0xfc, 0xc3, 0xad, 0x6c, 0x82, 0x87,
0xaa, 0x94, 0x85, 0xa9, 0xe9, 0x29, 0xfd, 0x50, 0xb5, 0xa0, 0xe8, 0x43, 0xb5, 0xc2, 0x06, 0x2f,
0x2e, 0xb8, 0x1a, 0xb8, 0x47, 0xff, 0x37, 0x17, 0x9e, 0xeb, 0xfd, 0x38, 0x84, 0x47, 0x2e, 0x17,
0x77, 0x04, 0xa6, 0x78, 0x56, 0x60, 0xca, 0x63, 0xab, 0xf3, 0x54, 0x6c, 0xe4, 0x22, 0x60, 0x1f,
0xf1, 0xdf, 0x1e, 0xfb, 0xa8, 0x78, 0x93, 0x51, 0xb9, 0x0f, 0xe4, 0xb4, 0xe8, 0xac, 0xd5, 0x0c,
0xf6, 0xb8, 0xe3, 0x0d, 0xef, 0xe0, 0xdd, 0x32, 0xbe, 0xdb, 0xd6, 0x0c, 0x57, 0x09, 0xbe, 0x71,
0xb2, 0x4a, 0x30, 0x10, 0xab, 0x92, 0x90, 0xf3, 0x21, 0x7e, 0x64, 0xb7, 0x9e, 0x88, 0xc9, 0x75,
0x9e, 0x71, 0xea, 0x4b, 0x4b, 0x25, 0x39, 0xb7, 0x9f, 0x45, 0x08, 0xe7, 0xf0, 0x61, 0x8f, 0x6b,
0x76, 0xbb, 0x38, 0x5d, 0xa5, 0xe1, 0x44, 0xab, 0x45, 0xed, 0xbd, 0xa3, 0xb7, 0x86, 0x54, 0xec,
0xe2, 0x08, 0xb8, 0x89, 0xf9, 0xe4, 0xf0, 0x97, 0x83, 0x65, 0x62, 0xc1, 0x98, 0xfd, 0x44, 0xf5,
0xab, 0xbf, 0xfa, 0x33, 0xd5, 0x5f, 0xda, 0x7e, 0xf9, 0x35, 0xab, 0x4f, 0x7d, 0xfb, 0xba, 0xbc,
0x55, 0x6a, 0x87, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xcf, 0xa2, 0x81, 0x89, 0x36, 0x13, 0x00,
0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -137,6 +139,8 @@ type TabletManagerClient interface {
SlaveStatus(ctx context.Context, in *tabletmanagerdata.SlaveStatusRequest, opts ...grpc.CallOption) (*tabletmanagerdata.SlaveStatusResponse, error)
// MasterPosition returns the current master position
MasterPosition(ctx context.Context, in *tabletmanagerdata.MasterPositionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.MasterPositionResponse, error)
// WaitForPosition waits for the position to be reached
WaitForPosition(ctx context.Context, in *tabletmanagerdata.WaitForPositionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.WaitForPositionResponse, error)
// StopSlave makes mysql stop its replication
StopSlave(ctx context.Context, in *tabletmanagerdata.StopSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveResponse, error)
// StopSlaveMinimum stops the mysql replication after it reaches
@ -407,6 +411,15 @@ func (c *tabletManagerClient) MasterPosition(ctx context.Context, in *tabletmana
return out, nil
}
func (c *tabletManagerClient) WaitForPosition(ctx context.Context, in *tabletmanagerdata.WaitForPositionRequest, opts ...grpc.CallOption) (*tabletmanagerdata.WaitForPositionResponse, error) {
out := new(tabletmanagerdata.WaitForPositionResponse)
err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/WaitForPosition", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *tabletManagerClient) StopSlave(ctx context.Context, in *tabletmanagerdata.StopSlaveRequest, opts ...grpc.CallOption) (*tabletmanagerdata.StopSlaveResponse, error) {
out := new(tabletmanagerdata.StopSlaveResponse)
err := c.cc.Invoke(ctx, "/tabletmanagerservice.TabletManager/StopSlave", in, out, opts...)
@ -691,6 +704,8 @@ type TabletManagerServer interface {
SlaveStatus(context.Context, *tabletmanagerdata.SlaveStatusRequest) (*tabletmanagerdata.SlaveStatusResponse, error)
// MasterPosition returns the current master position
MasterPosition(context.Context, *tabletmanagerdata.MasterPositionRequest) (*tabletmanagerdata.MasterPositionResponse, error)
// WaitForPosition waits for the position to be reached
WaitForPosition(context.Context, *tabletmanagerdata.WaitForPositionRequest) (*tabletmanagerdata.WaitForPositionResponse, error)
// StopSlave makes mysql stop its replication
StopSlave(context.Context, *tabletmanagerdata.StopSlaveRequest) (*tabletmanagerdata.StopSlaveResponse, error)
// StopSlaveMinimum stops the mysql replication after it reaches
@ -831,6 +846,9 @@ func (*UnimplementedTabletManagerServer) SlaveStatus(ctx context.Context, req *t
func (*UnimplementedTabletManagerServer) MasterPosition(ctx context.Context, req *tabletmanagerdata.MasterPositionRequest) (*tabletmanagerdata.MasterPositionResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method MasterPosition not implemented")
}
func (*UnimplementedTabletManagerServer) WaitForPosition(ctx context.Context, req *tabletmanagerdata.WaitForPositionRequest) (*tabletmanagerdata.WaitForPositionResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method WaitForPosition not implemented")
}
func (*UnimplementedTabletManagerServer) StopSlave(ctx context.Context, req *tabletmanagerdata.StopSlaveRequest) (*tabletmanagerdata.StopSlaveResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method StopSlave not implemented")
}
@ -1283,6 +1301,24 @@ func _TabletManager_MasterPosition_Handler(srv interface{}, ctx context.Context,
return interceptor(ctx, in, info, handler)
}
func _TabletManager_WaitForPosition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(tabletmanagerdata.WaitForPositionRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TabletManagerServer).WaitForPosition(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/tabletmanagerservice.TabletManager/WaitForPosition",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TabletManagerServer).WaitForPosition(ctx, req.(*tabletmanagerdata.WaitForPositionRequest))
}
return interceptor(ctx, in, info, handler)
}
func _TabletManager_StopSlave_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(tabletmanagerdata.StopSlaveRequest)
if err := dec(in); err != nil {
@ -1791,6 +1827,10 @@ var _TabletManager_serviceDesc = grpc.ServiceDesc{
MethodName: "MasterPosition",
Handler: _TabletManager_MasterPosition_Handler,
},
{
MethodName: "WaitForPosition",
Handler: _TabletManager_WaitForPosition_Handler,
},
{
MethodName: "StopSlave",
Handler: _TabletManager_StopSlave_Handler,

Просмотреть файл

@ -5,8 +5,9 @@ package throttlerdata
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -6,11 +6,12 @@ package throttlerservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
throttlerdata "vitess.io/vitess/go/vt/proto/throttlerdata"
)

Просмотреть файл

@ -288,10 +288,20 @@ type Tablet struct {
// MySQL port. Use topoproto.MysqlPort and topoproto.SetMysqlPort
// to access this variable. The functions provide support
// for legacy behavior.
MysqlPort int32 `protobuf:"varint,13,opt,name=mysql_port,json=mysqlPort,proto3" json:"mysql_port,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
MysqlPort int32 `protobuf:"varint,13,opt,name=mysql_port,json=mysqlPort,proto3" json:"mysql_port,omitempty"`
// master_term_start_time is the time (in UTC) at which the current term of
// the current tablet began as master. If this tablet is not currently the
// master, this value is ignored.
//
// A new master term begins any time an authoritative decision is communicated
// about which tablet should be the master, such as via Vitess
// replication-management commands like PlannedReparentShard,
// EmergencyReparentShard, and TabletExternallyReparented.
//
MasterTermStartTime *vttime.Time `protobuf:"bytes,14,opt,name=master_term_start_time,json=masterTermStartTime,proto3" json:"master_term_start_time,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Tablet) Reset() { *m = Tablet{} }
@ -396,14 +406,36 @@ func (m *Tablet) GetMysqlPort() int32 {
return 0
}
func (m *Tablet) GetMasterTermStartTime() *vttime.Time {
if m != nil {
return m.MasterTermStartTime
}
return nil
}
// A Shard contains data about a subset of the data whithin a keyspace.
type Shard struct {
// master_alias is the tablet alias of the master for the shard.
// If it is unset, then there is no master in this shard yet.
// No lock is necessary to update this field, when for instance
// TabletExternallyReparented updates this. However, we lock the
// shard for reparenting operations (InitShardMaster,
// PlannedReparentShard,EmergencyReparentShard), to guarantee
// exclusive operation.
MasterAlias *TabletAlias `protobuf:"bytes,1,opt,name=master_alias,json=masterAlias,proto3" json:"master_alias,omitempty"`
// master_term_start_time is the time (in UTC) at which the current term of
// the master specified in master_alias began.
//
// A new master term begins any time an authoritative decision is communicated
// about which tablet should be the master, such as via Vitess
// replication-management commands like PlannedReparentShard,
// EmergencyReparentShard, and TabletExternallyReparented.
//
// The master_alias should only ever be changed if the new master's term began
// at a later time than this. Note that a new term can start for the tablet
// that is already the master. In that case, the master_term_start_time would
// be increased without changing the master_alias.
MasterTermStartTime *vttime.Time `protobuf:"bytes,8,opt,name=master_term_start_time,json=masterTermStartTime,proto3" json:"master_term_start_time,omitempty"`
// key_range is the KeyRange for this shard. It can be unset if:
// - we are not using range-based sharding in this shard.
// - the shard covers the entire keyrange.
@ -462,6 +494,13 @@ func (m *Shard) GetMasterAlias() *TabletAlias {
return nil
}
func (m *Shard) GetMasterTermStartTime() *vttime.Time {
if m != nil {
return m.MasterTermStartTime
}
return nil
}
func (m *Shard) GetKeyRange() *KeyRange {
if m != nil {
return m.KeyRange
@ -1337,88 +1376,90 @@ func init() {
func init() { proto.RegisterFile("topodata.proto", fileDescriptor_52c350cb619f972e) }
var fileDescriptor_52c350cb619f972e = []byte{
// 1314 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xe1, 0x6e, 0x1b, 0x45,
0x10, 0xee, 0xd9, 0x67, 0xe7, 0x3c, 0x3e, 0x27, 0xd7, 0x25, 0xad, 0x4e, 0x07, 0x15, 0x91, 0x51,
0x85, 0x15, 0x84, 0x03, 0x69, 0x0b, 0x51, 0x11, 0x52, 0x5d, 0xc7, 0xa5, 0x69, 0x12, 0xc7, 0x5a,
0x3b, 0x82, 0xf2, 0xe7, 0x74, 0xb1, 0x37, 0xe9, 0x29, 0xe7, 0x3b, 0xf7, 0x76, 0x63, 0xc9, 0xbc,
0x02, 0x3f, 0x80, 0xbf, 0xbc, 0x01, 0x8f, 0xc0, 0xbb, 0xf0, 0x07, 0x9e, 0x04, 0xed, 0xec, 0xdd,
0xf9, 0x6c, 0xb7, 0x25, 0x45, 0xf9, 0xb7, 0x33, 0x3b, 0x33, 0x37, 0xf3, 0xcd, 0xcc, 0xb7, 0x36,
0xac, 0x8b, 0x68, 0x12, 0x8d, 0x3c, 0xe1, 0x35, 0x27, 0x71, 0x24, 0x22, 0x62, 0xa4, 0xb2, 0x03,
0xc2, 0x1f, 0x33, 0xa5, 0xad, 0xef, 0x82, 0x71, 0xc8, 0x66, 0xd4, 0x0b, 0x2f, 0x18, 0xd9, 0x84,
0x12, 0x17, 0x5e, 0x2c, 0x6c, 0x6d, 0x4b, 0x6b, 0x98, 0x54, 0x09, 0xc4, 0x82, 0x22, 0x0b, 0x47,
0x76, 0x01, 0x75, 0xf2, 0x58, 0x7f, 0x00, 0xd5, 0x81, 0x77, 0x16, 0x30, 0xd1, 0x0a, 0x7c, 0x8f,
0x13, 0x02, 0xfa, 0x90, 0x05, 0x01, 0x7a, 0x55, 0x28, 0x9e, 0xa5, 0xd3, 0x95, 0xaf, 0x9c, 0x6a,
0x54, 0x1e, 0xeb, 0x7f, 0xea, 0x50, 0x56, 0x5e, 0xe4, 0x33, 0x28, 0x79, 0xd2, 0x13, 0x3d, 0xaa,
0xbb, 0x77, 0x9a, 0x59, 0xa6, 0xb9, 0xb0, 0x54, 0xd9, 0x10, 0x07, 0x8c, 0x57, 0x11, 0x17, 0xa1,
0x37, 0x66, 0x18, 0xae, 0x42, 0x33, 0x99, 0xec, 0x81, 0x31, 0x89, 0x62, 0xe1, 0x8e, 0xbd, 0x89,
0xad, 0x6f, 0x15, 0x1b, 0xd5, 0xdd, 0x7b, 0xcb, 0xb1, 0x9a, 0xbd, 0x28, 0x16, 0xc7, 0xde, 0xa4,
0x13, 0x8a, 0x78, 0x46, 0xd7, 0x26, 0x4a, 0x92, 0x51, 0x2f, 0xd9, 0x8c, 0x4f, 0xbc, 0x21, 0xb3,
0x4b, 0x2a, 0x6a, 0x2a, 0x23, 0x0c, 0xaf, 0xbc, 0x78, 0x64, 0x97, 0xf1, 0x42, 0x09, 0x64, 0x07,
0x2a, 0x97, 0x6c, 0xe6, 0xc6, 0x12, 0x29, 0x7b, 0x0d, 0x13, 0x27, 0xf3, 0x8f, 0xa5, 0x18, 0x62,
0x18, 0x85, 0x66, 0x03, 0x74, 0x31, 0x9b, 0x30, 0xdb, 0xd8, 0xd2, 0x1a, 0xeb, 0xbb, 0x9b, 0xcb,
0x89, 0x0d, 0x66, 0x13, 0x46, 0xd1, 0x82, 0x34, 0xc0, 0x1a, 0x9d, 0xb9, 0xb2, 0x22, 0x37, 0x9a,
0xb2, 0x38, 0xf6, 0x47, 0xcc, 0xae, 0xe0, 0xb7, 0xd7, 0x47, 0x67, 0x5d, 0x6f, 0xcc, 0x4e, 0x12,
0x2d, 0x69, 0x82, 0x2e, 0xbc, 0x0b, 0x6e, 0x03, 0x16, 0xeb, 0xac, 0x14, 0x3b, 0xf0, 0x2e, 0xb8,
0xaa, 0x14, 0xed, 0xc8, 0x7d, 0x58, 0x1f, 0xcf, 0xf8, 0xeb, 0xc0, 0xcd, 0x20, 0x34, 0x31, 0x6e,
0x0d, 0xb5, 0xcf, 0x53, 0x1c, 0xef, 0x01, 0x28, 0x33, 0x09, 0x8f, 0x5d, 0xdb, 0xd2, 0x1a, 0x25,
0x5a, 0x41, 0x8d, 0x44, 0xcf, 0x79, 0x0c, 0x66, 0x1e, 0x45, 0xd9, 0xdc, 0x4b, 0x36, 0x4b, 0xfa,
0x2d, 0x8f, 0x12, 0xb2, 0xa9, 0x17, 0x5c, 0xa9, 0x0e, 0x95, 0xa8, 0x12, 0x1e, 0x17, 0xf6, 0x34,
0xe7, 0x6b, 0xa8, 0x64, 0x49, 0xfd, 0x97, 0x63, 0x25, 0xe7, 0xf8, 0x42, 0x37, 0x8a, 0x96, 0xfe,
0x42, 0x37, 0xaa, 0x96, 0x59, 0xff, 0xad, 0x0c, 0xa5, 0x3e, 0x76, 0x61, 0x0f, 0xcc, 0xb1, 0xc7,
0x05, 0x8b, 0xdd, 0x6b, 0x4c, 0x50, 0x55, 0x99, 0xaa, 0x29, 0x5d, 0xe8, 0x5f, 0xe1, 0x1a, 0xfd,
0xfb, 0x16, 0x4c, 0xce, 0xe2, 0x29, 0x1b, 0xb9, 0xb2, 0x49, 0xdc, 0x2e, 0x2e, 0x63, 0x8e, 0x19,
0x35, 0xfb, 0x68, 0x83, 0xdd, 0xac, 0xf2, 0xec, 0xcc, 0xc9, 0x13, 0xa8, 0xf1, 0xe8, 0x2a, 0x1e,
0x32, 0x17, 0xe7, 0x87, 0x27, 0x03, 0xfa, 0xe1, 0x8a, 0x3f, 0x1a, 0xe1, 0x99, 0x9a, 0x7c, 0x2e,
0x70, 0xf2, 0x0c, 0x36, 0x04, 0x56, 0xe3, 0x0e, 0xa3, 0x50, 0xc4, 0x51, 0xc0, 0xed, 0xf2, 0xf2,
0x90, 0xab, 0x18, 0xaa, 0xe8, 0xb6, 0xb2, 0xa2, 0xeb, 0x22, 0x2f, 0x72, 0xb2, 0x0d, 0xb7, 0x7d,
0xee, 0x26, 0xb0, 0xc9, 0x14, 0xfd, 0xf0, 0x02, 0x27, 0xd8, 0xa0, 0x1b, 0x3e, 0x3f, 0x46, 0x7d,
0x5f, 0xa9, 0x9d, 0x97, 0x00, 0xf3, 0x82, 0xc8, 0x23, 0xa8, 0x26, 0x19, 0xe0, 0x24, 0x6b, 0xef,
0x98, 0x64, 0x10, 0xd9, 0x59, 0x36, 0x55, 0x92, 0x00, 0xb7, 0x0b, 0x5b, 0x45, 0xd9, 0x54, 0x14,
0x9c, 0xdf, 0x35, 0xa8, 0xe6, 0x8a, 0x4d, 0x29, 0x42, 0xcb, 0x28, 0x62, 0x61, 0x29, 0x0b, 0x6f,
0x5b, 0xca, 0xe2, 0x5b, 0x97, 0x52, 0xbf, 0x46, 0x53, 0xef, 0x42, 0x19, 0x13, 0xe5, 0x76, 0x09,
0x73, 0x4b, 0x24, 0xe7, 0x0f, 0x0d, 0x6a, 0x0b, 0x28, 0xde, 0x68, 0xed, 0xe4, 0x73, 0x20, 0x67,
0x81, 0x37, 0xbc, 0x0c, 0x7c, 0x2e, 0xe4, 0x40, 0xa9, 0x14, 0x74, 0x34, 0xb9, 0x9d, 0xbb, 0xc1,
0xa0, 0x5c, 0x66, 0x79, 0x1e, 0x47, 0x3f, 0xb1, 0x10, 0xb9, 0xc9, 0xa0, 0x89, 0x94, 0xed, 0x44,
0xc9, 0x2a, 0xd7, 0xff, 0x2a, 0x22, 0x73, 0x2b, 0x74, 0xbe, 0x80, 0x4d, 0x04, 0xc4, 0x0f, 0x2f,
0xdc, 0x61, 0x14, 0x5c, 0x8d, 0x43, 0xa4, 0x93, 0x64, 0xd3, 0x48, 0x7a, 0xd7, 0xc6, 0x2b, 0xc9,
0x28, 0xe4, 0xc5, 0xaa, 0x07, 0xd6, 0x59, 0xc0, 0x3a, 0xed, 0x05, 0x10, 0xf1, 0x1b, 0x07, 0x6a,
0xc6, 0x97, 0x62, 0x61, 0xcd, 0x4f, 0xb2, 0x4d, 0x39, 0x8f, 0xa3, 0x31, 0x5f, 0xa5, 0xe2, 0x34,
0x46, 0xb2, 0x2c, 0xcf, 0xe2, 0x68, 0x9c, 0x2e, 0x8b, 0x3c, 0x73, 0xf2, 0x0d, 0xd4, 0xd2, 0x4e,
0xab, 0x34, 0x4a, 0x98, 0xc6, 0xdd, 0xd5, 0x10, 0x98, 0x84, 0x79, 0x99, 0x93, 0xc8, 0x27, 0x50,
0x3b, 0xf3, 0x38, 0x73, 0xb3, 0xd9, 0x51, 0xbc, 0x6d, 0x4a, 0x65, 0x86, 0xd0, 0x97, 0x50, 0xe3,
0xa1, 0x37, 0xe1, 0xaf, 0x22, 0xe1, 0xca, 0xe7, 0x2f, 0xa1, 0x70, 0xb3, 0x39, 0x15, 0xf8, 0x1a,
0x0e, 0xfc, 0x31, 0xa3, 0x66, 0x6a, 0x22, 0x25, 0xe7, 0x2a, 0xdd, 0x05, 0x99, 0xe3, 0xcd, 0xce,
0x43, 0x7e, 0xd2, 0x8b, 0x8b, 0x93, 0xae, 0x9a, 0x5c, 0xff, 0x59, 0x03, 0x4b, 0x91, 0x02, 0x9b,
0x04, 0xfe, 0xd0, 0x13, 0x7e, 0x14, 0x92, 0x47, 0x50, 0x0a, 0xa3, 0x11, 0x93, 0xb4, 0x27, 0x11,
0xfe, 0x78, 0x89, 0x07, 0x72, 0xa6, 0xcd, 0x6e, 0x34, 0x62, 0x54, 0x59, 0x3b, 0x4f, 0x40, 0x97,
0xa2, 0x24, 0xcf, 0xa4, 0x84, 0xeb, 0x90, 0xa7, 0x98, 0x0b, 0xf5, 0x53, 0x58, 0x4f, 0xbe, 0x70,
0xce, 0x62, 0x16, 0x0e, 0x99, 0x7c, 0xf4, 0x73, 0x13, 0x86, 0xe7, 0xf7, 0xa6, 0xd8, 0xfa, 0x2f,
0x1a, 0x10, 0x8c, 0xbb, 0xb8, 0x7a, 0x37, 0x11, 0x9b, 0x3c, 0x84, 0xbb, 0xaf, 0xaf, 0x58, 0x3c,
0x53, 0x8c, 0x37, 0x64, 0xee, 0xc8, 0xe7, 0xf2, 0x2b, 0x8a, 0x41, 0x0c, 0xba, 0x89, 0xb7, 0x7d,
0x75, 0xb9, 0x9f, 0xdc, 0xd5, 0xff, 0xd1, 0xa1, 0xda, 0x8f, 0xa7, 0xd9, 0xd8, 0x7c, 0x07, 0x30,
0xf1, 0x62, 0xe1, 0x4b, 0x4c, 0x53, 0xd8, 0x3f, 0xcd, 0xc1, 0x3e, 0x37, 0xcd, 0x26, 0xb4, 0x97,
0xda, 0xd3, 0x9c, 0xeb, 0x5b, 0x37, 0xb4, 0xf0, 0xde, 0x1b, 0x5a, 0xfc, 0x1f, 0x1b, 0xda, 0x82,
0x6a, 0x6e, 0x43, 0x93, 0x05, 0xdd, 0x7a, 0x73, 0x1d, 0xb9, 0x1d, 0x85, 0xf9, 0x8e, 0x3a, 0x7f,
0x6b, 0x70, 0x7b, 0xa5, 0x44, 0xb9, 0x15, 0xb9, 0x47, 0xf2, 0xdd, 0x5b, 0x31, 0x7f, 0x1d, 0x49,
0x1b, 0x2c, 0xcc, 0xd2, 0x8d, 0xd3, 0x81, 0x52, 0x0b, 0x52, 0xcd, 0xd7, 0xb5, 0x38, 0x71, 0x74,
0x83, 0x2f, 0xc8, 0x9c, 0xf4, 0xe0, 0x8e, 0x0a, 0xb2, 0xfc, 0x4a, 0xaa, 0x97, 0xfa, 0xa3, 0xa5,
0x48, 0x8b, 0x8f, 0xe4, 0x07, 0x7c, 0x45, 0xc7, 0x1d, 0xf7, 0x26, 0x36, 0xfe, 0x1d, 0xaf, 0x58,
0x42, 0xdd, 0x87, 0x60, 0xb4, 0x59, 0x10, 0x1c, 0x84, 0xe7, 0x91, 0xfc, 0x85, 0x86, 0xb8, 0xc4,
0xae, 0x37, 0x1a, 0xc5, 0x8c, 0xf3, 0x64, 0xea, 0x6b, 0x4a, 0xdb, 0x52, 0x4a, 0xb9, 0x12, 0x71,
0x14, 0x89, 0x24, 0x20, 0x9e, 0x13, 0xa2, 0xa8, 0x03, 0xc8, 0x60, 0x5c, 0xfd, 0xca, 0x79, 0x23,
0xdd, 0x6c, 0x37, 0xc0, 0xcc, 0xf3, 0x27, 0x01, 0x28, 0x77, 0x4f, 0xe8, 0x71, 0xeb, 0xc8, 0xba,
0x45, 0x4c, 0x30, 0xfa, 0xdd, 0x56, 0xaf, 0xff, 0xfc, 0x64, 0x60, 0x69, 0xdb, 0xbb, 0xb0, 0xbe,
0x38, 0x4e, 0xa4, 0x02, 0xa5, 0xd3, 0x6e, 0xbf, 0x33, 0xb0, 0x6e, 0x49, 0xb7, 0xd3, 0x83, 0xee,
0xe0, 0xab, 0x87, 0x96, 0x26, 0xd5, 0x4f, 0x5f, 0x0e, 0x3a, 0x7d, 0xab, 0xb0, 0xfd, 0xab, 0x06,
0x30, 0xc7, 0x82, 0x54, 0x61, 0xed, 0xb4, 0x7b, 0xd8, 0x3d, 0xf9, 0xbe, 0xab, 0x5c, 0x8e, 0x5b,
0xfd, 0x41, 0x87, 0x5a, 0x9a, 0xbc, 0xa0, 0x9d, 0xde, 0xd1, 0x41, 0xbb, 0x65, 0x15, 0xe4, 0x05,
0xdd, 0x3f, 0xe9, 0x1e, 0xbd, 0xb4, 0x8a, 0x18, 0xab, 0x35, 0x68, 0x3f, 0x57, 0xc7, 0x7e, 0xaf,
0x45, 0x3b, 0x96, 0x4e, 0x2c, 0x30, 0x3b, 0x3f, 0xf4, 0x3a, 0xf4, 0xe0, 0xb8, 0xd3, 0x1d, 0xb4,
0x8e, 0xac, 0x92, 0xf4, 0x79, 0xda, 0x6a, 0x1f, 0x9e, 0xf6, 0xac, 0xb2, 0x0a, 0xd6, 0x1f, 0x9c,
0xd0, 0x8e, 0xb5, 0x26, 0x85, 0x7d, 0xda, 0x3a, 0xe8, 0x76, 0xf6, 0x2d, 0xc3, 0x29, 0x58, 0xda,
0xd3, 0x3d, 0xd8, 0xf0, 0xa3, 0xe6, 0xd4, 0x17, 0x8c, 0x73, 0xf5, 0x47, 0xe7, 0xc7, 0xfb, 0x89,
0xe4, 0x47, 0x3b, 0xea, 0xb4, 0x73, 0x11, 0xed, 0x4c, 0xc5, 0x0e, 0xde, 0xee, 0xa4, 0x4d, 0x3d,
0x2b, 0xa3, 0xfc, 0xe0, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa8, 0x5c, 0xc8, 0x21, 0x3e, 0x0d,
0x00, 0x00,
// 1349 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6e, 0xdb, 0x46,
0x13, 0x0f, 0xf5, 0xcf, 0xd4, 0x88, 0x92, 0x99, 0x8d, 0x63, 0x10, 0xfa, 0xbe, 0xa0, 0x86, 0x8a,
0xa0, 0x82, 0x8b, 0xca, 0xad, 0x93, 0xb4, 0x46, 0x8a, 0x02, 0x51, 0x64, 0xa5, 0x71, 0x6c, 0xcb,
0xc2, 0x4a, 0x46, 0x9b, 0x5e, 0x08, 0x5a, 0x5a, 0x3b, 0x84, 0x25, 0x52, 0xd9, 0x5d, 0x0b, 0x50,
0x5f, 0xa1, 0x87, 0xf6, 0xdc, 0x37, 0xe8, 0xfb, 0xf4, 0xd8, 0x4b, 0xfb, 0x1c, 0x3d, 0x14, 0x3b,
0x4b, 0x52, 0x94, 0x14, 0xa7, 0x4e, 0xe1, 0xdb, 0xcc, 0xec, 0xcc, 0x70, 0xe6, 0xb7, 0xbf, 0x99,
0x95, 0xa0, 0x22, 0xc3, 0x49, 0x38, 0xf4, 0xa4, 0xd7, 0x98, 0xf0, 0x50, 0x86, 0xc4, 0x8c, 0xf5,
0x2a, 0x48, 0x7f, 0xcc, 0xb4, 0xb5, 0xb6, 0x0b, 0xe6, 0x21, 0x9b, 0x51, 0x2f, 0xb8, 0x60, 0x64,
0x03, 0xf2, 0x42, 0x7a, 0x5c, 0x3a, 0xc6, 0x96, 0x51, 0xb7, 0xa8, 0x56, 0x88, 0x0d, 0x59, 0x16,
0x0c, 0x9d, 0x0c, 0xda, 0x94, 0x58, 0x7b, 0x04, 0xa5, 0xbe, 0x77, 0x36, 0x62, 0xb2, 0x39, 0xf2,
0x3d, 0x41, 0x08, 0xe4, 0x06, 0x6c, 0x34, 0xc2, 0xa8, 0x22, 0x45, 0x59, 0x05, 0x5d, 0xf9, 0x3a,
0xa8, 0x4c, 0x95, 0x58, 0xfb, 0x3b, 0x07, 0x05, 0x1d, 0x45, 0x3e, 0x85, 0xbc, 0xa7, 0x22, 0x31,
0xa2, 0xb4, 0x7b, 0xbf, 0x91, 0x54, 0x9a, 0x4a, 0x4b, 0xb5, 0x0f, 0xa9, 0x82, 0xf9, 0x26, 0x14,
0x32, 0xf0, 0xc6, 0x0c, 0xd3, 0x15, 0x69, 0xa2, 0x93, 0x3d, 0x30, 0x27, 0x21, 0x97, 0xee, 0xd8,
0x9b, 0x38, 0xb9, 0xad, 0x6c, 0xbd, 0xb4, 0xfb, 0x60, 0x39, 0x57, 0xa3, 0x1b, 0x72, 0x79, 0xec,
0x4d, 0xda, 0x81, 0xe4, 0x33, 0xba, 0x36, 0xd1, 0x9a, 0xca, 0x7a, 0xc9, 0x66, 0x62, 0xe2, 0x0d,
0x98, 0x93, 0xd7, 0x59, 0x63, 0x1d, 0x61, 0x78, 0xe3, 0xf1, 0xa1, 0x53, 0xc0, 0x03, 0xad, 0x90,
0x1d, 0x28, 0x5e, 0xb2, 0x99, 0xcb, 0x15, 0x52, 0xce, 0x1a, 0x16, 0x4e, 0xe6, 0x1f, 0x8b, 0x31,
0xc4, 0x34, 0x1a, 0xcd, 0x3a, 0xe4, 0xe4, 0x6c, 0xc2, 0x1c, 0x73, 0xcb, 0xa8, 0x57, 0x76, 0x37,
0x96, 0x0b, 0xeb, 0xcf, 0x26, 0x8c, 0xa2, 0x07, 0xa9, 0x83, 0x3d, 0x3c, 0x73, 0x55, 0x47, 0x6e,
0x38, 0x65, 0x9c, 0xfb, 0x43, 0xe6, 0x14, 0xf1, 0xdb, 0x95, 0xe1, 0x59, 0xc7, 0x1b, 0xb3, 0x93,
0xc8, 0x4a, 0x1a, 0x90, 0x93, 0xde, 0x85, 0x70, 0x00, 0x9b, 0xad, 0xae, 0x34, 0xdb, 0xf7, 0x2e,
0x84, 0xee, 0x14, 0xfd, 0xc8, 0x43, 0xa8, 0x8c, 0x67, 0xe2, 0xed, 0xc8, 0x4d, 0x20, 0xb4, 0x30,
0x6f, 0x19, 0xad, 0x2f, 0x63, 0x1c, 0x1f, 0x00, 0x68, 0x37, 0x05, 0x8f, 0x53, 0xde, 0x32, 0xea,
0x79, 0x5a, 0x44, 0x8b, 0x42, 0x8f, 0x34, 0x61, 0x73, 0xec, 0x09, 0xc9, 0xb8, 0x2b, 0x19, 0x1f,
0xbb, 0x48, 0x0b, 0x57, 0x71, 0xc8, 0xa9, 0x20, 0x0e, 0x56, 0x63, 0x2a, 0x91, 0x52, 0x7d, 0x7f,
0xcc, 0xe8, 0x3d, 0xed, 0xdb, 0x67, 0x7c, 0xdc, 0x53, 0x9e, 0xca, 0x58, 0x7d, 0x0a, 0x56, 0xfa,
0x22, 0x14, 0x3f, 0x2e, 0xd9, 0x2c, 0xa2, 0x8c, 0x12, 0x15, 0xea, 0x53, 0x6f, 0x74, 0xa5, 0x2f,
0x39, 0x4f, 0xb5, 0xf2, 0x34, 0xb3, 0x67, 0x54, 0xbf, 0x82, 0x62, 0xd2, 0xd7, 0xbf, 0x05, 0x16,
0x53, 0x81, 0xaf, 0x72, 0x66, 0xd6, 0xce, 0xbd, 0xca, 0x99, 0x25, 0xdb, 0xaa, 0xfd, 0x5e, 0x80,
0x7c, 0x0f, 0x2f, 0x72, 0x0f, 0xac, 0xa8, 0x9b, 0x1b, 0x90, 0xb0, 0xa4, 0x5d, 0x35, 0xd1, 0xaf,
0xc7, 0xc1, 0xbc, 0x21, 0x0e, 0x8b, 0x2c, 0xca, 0xdc, 0x80, 0x45, 0xdf, 0x80, 0x25, 0x18, 0x9f,
0xb2, 0xa1, 0xab, 0xa8, 0x22, 0x9c, 0xec, 0xf2, 0xcd, 0x63, 0x53, 0x8d, 0x1e, 0xfa, 0x20, 0xa7,
0x4a, 0x22, 0x91, 0x05, 0x79, 0x06, 0x65, 0x11, 0x5e, 0xf1, 0x01, 0x73, 0x91, 0xc5, 0x22, 0x1a,
0x93, 0xff, 0xad, 0xc4, 0xa3, 0x13, 0xca, 0xd4, 0x12, 0x73, 0x45, 0x90, 0x17, 0xb0, 0x2e, 0x11,
0x10, 0x77, 0x10, 0x06, 0x92, 0x87, 0x23, 0xe1, 0x14, 0x96, 0x47, 0x4d, 0xe7, 0xd0, 0xb8, 0xb5,
0xb4, 0x17, 0xad, 0xc8, 0xb4, 0x2a, 0xc8, 0x36, 0xdc, 0xf5, 0x85, 0x1b, 0xe1, 0xa7, 0x4a, 0xf4,
0x83, 0x0b, 0x9c, 0x23, 0x93, 0xae, 0xfb, 0xe2, 0x18, 0xed, 0x3d, 0x6d, 0xae, 0xbe, 0x06, 0x98,
0x37, 0x44, 0x9e, 0x40, 0x29, 0xaa, 0x00, 0xe7, 0xc9, 0x78, 0xcf, 0x3c, 0x81, 0x4c, 0x64, 0xc5,
0x0b, 0xb5, 0x8a, 0x84, 0x93, 0xd9, 0xca, 0x2a, 0x5e, 0xa0, 0x52, 0xfd, 0xd5, 0x80, 0x52, 0xaa,
0xd9, 0x78, 0x51, 0x19, 0xc9, 0xa2, 0x5a, 0x58, 0x0d, 0x99, 0xeb, 0x56, 0x43, 0xf6, 0xda, 0xd5,
0x90, 0xbb, 0xc1, 0xa5, 0x6e, 0x42, 0x01, 0x0b, 0x15, 0x4e, 0x1e, 0x6b, 0x8b, 0xb4, 0xea, 0x6f,
0x06, 0x94, 0x17, 0x50, 0xbc, 0xd5, 0xde, 0xc9, 0x67, 0x40, 0xce, 0x46, 0xde, 0xe0, 0x72, 0xe4,
0x0b, 0xa9, 0x08, 0xa5, 0x4b, 0xc8, 0xa1, 0xcb, 0xdd, 0xd4, 0x09, 0x26, 0x15, 0xaa, 0xca, 0x73,
0x1e, 0xfe, 0xc8, 0x02, 0xdc, 0x90, 0x26, 0x8d, 0xb4, 0x64, 0xac, 0xf2, 0x76, 0xa1, 0xf6, 0x47,
0x16, 0xdf, 0x0f, 0x8d, 0xce, 0xe7, 0xb0, 0x81, 0x80, 0xf8, 0xc1, 0x85, 0x3b, 0x08, 0x47, 0x57,
0xe3, 0x00, 0x97, 0x5a, 0x34, 0xac, 0x24, 0x3e, 0x6b, 0xe1, 0x91, 0xda, 0x6b, 0xe4, 0xd5, 0x6a,
0x04, 0xf6, 0x99, 0xc1, 0x3e, 0x9d, 0x05, 0x10, 0xf1, 0x1b, 0x07, 0x9a, 0xe3, 0x4b, 0xb9, 0xb0,
0xe7, 0x67, 0xc9, 0xa4, 0x9c, 0xf3, 0x70, 0x2c, 0x56, 0x1f, 0x84, 0x38, 0x47, 0x34, 0x2c, 0x2f,
0x78, 0x38, 0x8e, 0x87, 0x45, 0xc9, 0x82, 0x7c, 0x0d, 0xe5, 0xf8, 0xa6, 0x75, 0x19, 0x79, 0x2c,
0x63, 0x73, 0x35, 0x05, 0x16, 0x61, 0x5d, 0xa6, 0x34, 0xf2, 0x31, 0x94, 0xcf, 0x3c, 0xc1, 0xdc,
0x84, 0x3b, 0xfa, 0xf5, 0xb0, 0x94, 0x31, 0x41, 0xe8, 0x0b, 0x28, 0x8b, 0xc0, 0x9b, 0x88, 0x37,
0x61, 0xb4, 0x38, 0xd6, 0xde, 0xb1, 0x38, 0xac, 0xd8, 0x05, 0x37, 0xe7, 0x55, 0x3c, 0x0b, 0xaa,
0xc6, 0xdb, 0xe5, 0x43, 0x9a, 0xe9, 0xd9, 0x45, 0xa6, 0xeb, 0x4b, 0xae, 0xfd, 0x64, 0x80, 0xad,
0x97, 0x02, 0x9b, 0x8c, 0xfc, 0x81, 0x27, 0xfd, 0x30, 0x20, 0x4f, 0x20, 0x1f, 0x84, 0x43, 0xa6,
0x36, 0xa7, 0x42, 0xf8, 0xa3, 0xa5, 0x3d, 0x90, 0x72, 0x6d, 0x74, 0xc2, 0x21, 0xa3, 0xda, 0xbb,
0xfa, 0x0c, 0x72, 0x4a, 0x55, 0xfb, 0x37, 0x6a, 0xe1, 0x26, 0xfb, 0x57, 0xce, 0x95, 0xda, 0x29,
0x54, 0xa2, 0x2f, 0x9c, 0x33, 0xce, 0x82, 0x01, 0x53, 0x3f, 0x3d, 0x52, 0x0c, 0x43, 0xf9, 0x83,
0x57, 0x6c, 0xed, 0x67, 0x03, 0x08, 0xe6, 0x5d, 0x1c, 0xbd, 0xdb, 0xc8, 0x4d, 0x1e, 0xc3, 0xe6,
0xdb, 0x2b, 0xc6, 0x67, 0x7a, 0xe3, 0x0d, 0x98, 0x3b, 0xf4, 0x85, 0xfa, 0x8a, 0xde, 0x20, 0x26,
0xdd, 0xc0, 0xd3, 0x9e, 0x3e, 0xdc, 0x8f, 0xce, 0x6a, 0x7f, 0xe5, 0xa0, 0xd4, 0xe3, 0xd3, 0x84,
0x36, 0xdf, 0x02, 0x4c, 0x3c, 0x2e, 0x7d, 0x85, 0x69, 0x0c, 0xfb, 0x27, 0x29, 0xd8, 0xe7, 0xae,
0x09, 0x43, 0xbb, 0xb1, 0x3f, 0x4d, 0x85, 0x5e, 0x3b, 0xa1, 0x99, 0x0f, 0x9e, 0xd0, 0xec, 0x7f,
0x98, 0xd0, 0x26, 0x94, 0x52, 0x13, 0x1a, 0x0d, 0xe8, 0xd6, 0xbb, 0xfb, 0x48, 0xcd, 0x28, 0xcc,
0x67, 0xb4, 0xfa, 0xa7, 0x01, 0x77, 0x57, 0x5a, 0x54, 0x53, 0x91, 0x7a, 0x24, 0xdf, 0x3f, 0x15,
0xf3, 0xd7, 0x91, 0xb4, 0xc0, 0xc6, 0x2a, 0x5d, 0x1e, 0x13, 0x4a, 0x0f, 0x48, 0x29, 0xdd, 0xd7,
0x22, 0xe3, 0xe8, 0xba, 0x58, 0xd0, 0x05, 0xe9, 0xc2, 0x7d, 0x9d, 0x64, 0xf9, 0x95, 0xd4, 0x2f,
0xf5, 0xff, 0x97, 0x32, 0x2d, 0x3e, 0x92, 0xf7, 0xc4, 0x8a, 0x4d, 0x54, 0xdd, 0xdb, 0x98, 0xf8,
0xf7, 0xbc, 0x62, 0xd1, 0xea, 0x3e, 0x04, 0xb3, 0xc5, 0x46, 0xa3, 0x83, 0xe0, 0x3c, 0x54, 0xbf,
0x13, 0x11, 0x17, 0xee, 0x7a, 0xc3, 0x21, 0x67, 0x42, 0x44, 0xac, 0x2f, 0x6b, 0x6b, 0x53, 0x1b,
0xd5, 0x48, 0xf0, 0x30, 0x94, 0x51, 0x42, 0x94, 0xa3, 0x45, 0x51, 0x03, 0x50, 0xc9, 0x84, 0xfe,
0xa1, 0xf4, 0xce, 0x75, 0xb3, 0x5d, 0x07, 0x2b, 0xbd, 0x3f, 0x09, 0x40, 0xa1, 0x73, 0x42, 0x8f,
0x9b, 0x47, 0xf6, 0x1d, 0x62, 0x81, 0xd9, 0xeb, 0x34, 0xbb, 0xbd, 0x97, 0x27, 0x7d, 0xdb, 0xd8,
0xde, 0x85, 0xca, 0x22, 0x9d, 0x48, 0x11, 0xf2, 0xa7, 0x9d, 0x5e, 0xbb, 0x6f, 0xdf, 0x51, 0x61,
0xa7, 0x07, 0x9d, 0xfe, 0x97, 0x8f, 0x6d, 0x43, 0x99, 0x9f, 0xbf, 0xee, 0xb7, 0x7b, 0x76, 0x66,
0xfb, 0x17, 0x03, 0x60, 0x8e, 0x05, 0x29, 0xc1, 0xda, 0x69, 0xe7, 0xb0, 0x73, 0xf2, 0x5d, 0x47,
0x87, 0x1c, 0x37, 0x7b, 0xfd, 0x36, 0xb5, 0x0d, 0x75, 0x40, 0xdb, 0xdd, 0xa3, 0x83, 0x56, 0xd3,
0xce, 0xa8, 0x03, 0xba, 0x7f, 0xd2, 0x39, 0x7a, 0x6d, 0x67, 0x31, 0x57, 0xb3, 0xdf, 0x7a, 0xa9,
0xc5, 0x5e, 0xb7, 0x49, 0xdb, 0x76, 0x8e, 0xd8, 0x60, 0xb5, 0xbf, 0xef, 0xb6, 0xe9, 0xc1, 0x71,
0xbb, 0xd3, 0x6f, 0x1e, 0xd9, 0x79, 0x15, 0xf3, 0xbc, 0xd9, 0x3a, 0x3c, 0xed, 0xda, 0x05, 0x9d,
0xac, 0xd7, 0x3f, 0xa1, 0x6d, 0x7b, 0x4d, 0x29, 0xfb, 0xb4, 0x79, 0xd0, 0x69, 0xef, 0xdb, 0x66,
0x35, 0x63, 0x1b, 0xcf, 0xf7, 0x60, 0xdd, 0x0f, 0x1b, 0x53, 0x5f, 0x32, 0x21, 0xf4, 0xdf, 0xad,
0x1f, 0x1e, 0x46, 0x9a, 0x1f, 0xee, 0x68, 0x69, 0xe7, 0x22, 0xdc, 0x99, 0xca, 0x1d, 0x3c, 0xdd,
0x89, 0x2f, 0xf5, 0xac, 0x80, 0xfa, 0xa3, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe2, 0xab, 0xbe,
0xeb, 0xc4, 0x0d, 0x00, 0x00,
}

Просмотреть файл

@ -116,13 +116,14 @@ func (m *RoutingRule) GetToTables() []string {
// Keyspace is the vschema for a keyspace.
type Keyspace struct {
// If sharded is false, vindexes and tables are ignored.
Sharded bool `protobuf:"varint,1,opt,name=sharded,proto3" json:"sharded,omitempty"`
Vindexes map[string]*Vindex `protobuf:"bytes,2,rep,name=vindexes,proto3" json:"vindexes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Tables map[string]*Table `protobuf:"bytes,3,rep,name=tables,proto3" json:"tables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
RequireExplicitRouting bool `protobuf:"varint,4,opt,name=require_explicit_routing,json=requireExplicitRouting,proto3" json:"require_explicit_routing,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
Sharded bool `protobuf:"varint,1,opt,name=sharded,proto3" json:"sharded,omitempty"`
Vindexes map[string]*Vindex `protobuf:"bytes,2,rep,name=vindexes,proto3" json:"vindexes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Tables map[string]*Table `protobuf:"bytes,3,rep,name=tables,proto3" json:"tables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// If require_explicit_routing is true, vindexes and tables are not added to global routing
RequireExplicitRouting bool `protobuf:"varint,4,opt,name=require_explicit_routing,json=requireExplicitRouting,proto3" json:"require_explicit_routing,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Keyspace) Reset() { *m = Keyspace{} }

Просмотреть файл

@ -5,8 +5,9 @@ package vtctldata
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
logutil "vitess.io/vitess/go/vt/proto/logutil"
)

Просмотреть файл

@ -6,11 +6,12 @@ package vtctlservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
vtctldata "vitess.io/vitess/go/vt/proto/vtctldata"
)

Просмотреть файл

@ -5,8 +5,9 @@ package vtgate
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
binlogdata "vitess.io/vitess/go/vt/proto/binlogdata"
query "vitess.io/vitess/go/vt/proto/query"
topodata "vitess.io/vitess/go/vt/proto/topodata"

Просмотреть файл

@ -6,11 +6,12 @@ package vtgateservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
query "vitess.io/vitess/go/vt/proto/query"
vtgate "vitess.io/vitess/go/vt/proto/vtgate"
)

Просмотреть файл

@ -5,8 +5,9 @@ package vtrpc
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -5,8 +5,9 @@ package vttest
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -5,8 +5,9 @@ package vttime
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -5,8 +5,9 @@ package vtworkerdata
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
logutil "vitess.io/vitess/go/vt/proto/logutil"
)

Просмотреть файл

@ -6,11 +6,12 @@ package vtworkerservice
import (
context "context"
fmt "fmt"
math "math"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
math "math"
vtworkerdata "vitess.io/vitess/go/vt/proto/vtworkerdata"
)

Просмотреть файл

@ -5,8 +5,9 @@ package workflow
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.

Просмотреть файл

@ -17,62 +17,62 @@ limitations under the License.
package servenv
import (
"testing"
"testing"
"golang.org/x/net/context"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc"
)
func TestEmpty(t *testing.T) {
interceptors := &serverInterceptorBuilder{}
if len(interceptors.Build()) > 0 {
t.Fatalf("expected empty builder to report as empty")
}
interceptors := &serverInterceptorBuilder{}
if len(interceptors.Build()) > 0 {
t.Fatalf("expected empty builder to report as empty")
}
}
func TestSingleInterceptor(t *testing.T) {
interceptors := &serverInterceptorBuilder{}
fake := &FakeInterceptor{}
interceptors := &serverInterceptorBuilder{}
fake := &FakeInterceptor{}
interceptors.Add(fake.StreamServerInterceptor, fake.UnaryServerInterceptor)
interceptors.Add(fake.StreamServerInterceptor, fake.UnaryServerInterceptor)
if len(interceptors.streamInterceptors) != 1 {
t.Fatalf("expected 1 server options to be available")
}
if len(interceptors.unaryInterceptors) != 1 {
t.Fatalf("expected 1 server options to be available")
}
if len(interceptors.streamInterceptors) != 1 {
t.Fatalf("expected 1 server options to be available")
}
if len(interceptors.unaryInterceptors) != 1 {
t.Fatalf("expected 1 server options to be available")
}
}
func TestDoubleInterceptor(t *testing.T) {
interceptors := &serverInterceptorBuilder{}
fake1 := &FakeInterceptor{name: "ettan"}
fake2 := &FakeInterceptor{name: "tvaon"}
interceptors := &serverInterceptorBuilder{}
fake1 := &FakeInterceptor{name: "ettan"}
fake2 := &FakeInterceptor{name: "tvaon"}
interceptors.Add(fake1.StreamServerInterceptor, fake1.UnaryServerInterceptor)
interceptors.Add(fake2.StreamServerInterceptor, fake2.UnaryServerInterceptor)
interceptors.Add(fake1.StreamServerInterceptor, fake1.UnaryServerInterceptor)
interceptors.Add(fake2.StreamServerInterceptor, fake2.UnaryServerInterceptor)
if len(interceptors.streamInterceptors) != 2 {
t.Fatalf("expected 1 server options to be available")
}
if len(interceptors.unaryInterceptors) != 2 {
t.Fatalf("expected 1 server options to be available")
}
if len(interceptors.streamInterceptors) != 2 {
t.Fatalf("expected 1 server options to be available")
}
if len(interceptors.unaryInterceptors) != 2 {
t.Fatalf("expected 1 server options to be available")
}
}
type FakeInterceptor struct {
name string
streamSeen interface{}
unarySeen interface{}
name string
streamSeen interface{}
unarySeen interface{}
}
func (fake *FakeInterceptor) StreamServerInterceptor(value interface{}, stream grpc.ServerStream, _ *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
fake.streamSeen = value
return handler(value, stream)
fake.streamSeen = value
return handler(value, stream)
}
func (fake *FakeInterceptor) UnaryServerInterceptor(ctx context.Context, value interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
fake.unarySeen = value
return handler(ctx, value)
fake.unarySeen = value
return handler(ctx, value)
}

Просмотреть файл

@ -2546,7 +2546,6 @@ func TestSkipToEnd(t *testing.T) {
func TestParseDjangoQueries(t *testing.T) {
file, err := os.Open("./test_queries/django_queries.txt")
defer file.Close()
if err != nil {

Просмотреть файл

@ -24,8 +24,10 @@ import (
"sort"
"strings"
"sync"
"time"
"golang.org/x/net/context"
"vitess.io/vitess/go/vt/logutil"
"vitess.io/vitess/go/vt/proto/vtrpc"
"vitess.io/vitess/go/vt/vterrors"
@ -174,6 +176,16 @@ func (si *ShardInfo) HasMaster() bool {
return !topoproto.TabletAliasIsZero(si.Shard.MasterAlias)
}
// GetMasterTermStartTime returns the shard's master term start time as a Time value.
func (si *ShardInfo) GetMasterTermStartTime() time.Time {
return logutil.ProtoToTime(si.Shard.MasterTermStartTime)
}
// SetMasterTermStartTime sets the shard's master term start time as a Time value.
func (si *ShardInfo) SetMasterTermStartTime(t time.Time) {
si.Shard.MasterTermStartTime = logutil.TimeToProto(t)
}
// GetShard is a high level function to read shard data.
// It generates trace spans.
func (ts *Server) GetShard(ctx context.Context, keyspace, shard string) (*ShardInfo, error) {
@ -182,7 +194,7 @@ func (ts *Server) GetShard(ctx context.Context, keyspace, shard string) (*ShardI
span.Annotate("shard", shard)
defer span.Finish()
shardPath := path.Join(KeyspacesPath, keyspace, ShardsPath, shard, ShardFile)
shardPath := shardFilePath(keyspace, shard)
data, version, err := ts.globalCell.Get(ctx, shardPath)
if err != nil {
return nil, err
@ -212,7 +224,7 @@ func (ts *Server) updateShard(ctx context.Context, si *ShardInfo) error {
if err != nil {
return err
}
shardPath := path.Join(KeyspacesPath, si.keyspace, ShardsPath, si.shardName, ShardFile)
shardPath := shardFilePath(si.keyspace, si.shardName)
newVersion, err := ts.globalCell.Update(ctx, shardPath, data, si.version)
if err != nil {
return err
@ -302,7 +314,7 @@ func (ts *Server) CreateShard(ctx context.Context, keyspace, shard string) (err
if err != nil {
return err
}
shardPath := path.Join(KeyspacesPath, keyspace, ShardsPath, shard, ShardFile)
shardPath := shardFilePath(keyspace, shard)
if _, err := ts.globalCell.Create(ctx, shardPath, data); err != nil {
// Return error as is, we need to propagate
// ErrNodeExists for instance.
@ -349,7 +361,7 @@ func (ts *Server) GetOrCreateShard(ctx context.Context, keyspace, shard string)
// DeleteShard wraps the underlying conn.Delete
// and dispatches the event.
func (ts *Server) DeleteShard(ctx context.Context, keyspace, shard string) error {
shardPath := path.Join(KeyspacesPath, keyspace, ShardsPath, shard, ShardFile)
shardPath := shardFilePath(keyspace, shard)
if err := ts.globalCell.Delete(ctx, shardPath, nil); err != nil {
return err
}
@ -578,3 +590,66 @@ func (ts *Server) GetTabletMapForShardByCell(ctx context.Context, keyspace, shar
}
return result, gerr
}
func shardFilePath(keyspace, shard string) string {
return path.Join(KeyspacesPath, keyspace, ShardsPath, shard, ShardFile)
}
// WatchShardData wraps the data we receive on the watch channel
// The WatchShard API guarantees exactly one of Value or Err will be set.
type WatchShardData struct {
Value *topodatapb.Shard
Err error
}
// WatchShard will set a watch on the Shard object.
// It has the same contract as conn.Watch, but it also unpacks the
// contents into a Shard object
func (ts *Server) WatchShard(ctx context.Context, keyspace, shard string) (*WatchShardData, <-chan *WatchShardData, CancelFunc) {
shardPath := shardFilePath(keyspace, shard)
current, wdChannel, cancel := ts.globalCell.Watch(ctx, shardPath)
if current.Err != nil {
return &WatchShardData{Err: current.Err}, nil, nil
}
value := &topodatapb.Shard{}
if err := proto.Unmarshal(current.Contents, value); err != nil {
// Cancel the watch, drain channel.
cancel()
for range wdChannel {
}
return &WatchShardData{Err: vterrors.Wrapf(err, "error unpacking initial Shard object")}, nil, nil
}
changes := make(chan *WatchShardData, 10)
// The background routine reads any event from the watch channel,
// translates it, and sends it to the caller.
// If cancel() is called, the underlying Watch() code will
// send an ErrInterrupted and then close the channel. We'll
// just propagate that back to our caller.
go func() {
defer close(changes)
for wd := range wdChannel {
if wd.Err != nil {
// Last error value, we're done.
// wdChannel will be closed right after
// this, no need to do anything.
changes <- &WatchShardData{Err: wd.Err}
return
}
value := &topodatapb.Shard{}
if err := proto.Unmarshal(wd.Contents, value); err != nil {
cancel()
for range wdChannel {
}
changes <- &WatchShardData{Err: vterrors.Wrapf(err, "error unpacking Shard object")}
return
}
changes <- &WatchShardData{Value: value}
}
}()
return &WatchShardData{Value: value}, changes, cancel
}

Просмотреть файл

@ -20,6 +20,7 @@ import (
"fmt"
"path"
"sync"
"time"
"golang.org/x/net/context"
"vitess.io/vitess/go/vt/proto/vtrpc"
@ -30,6 +31,7 @@ import (
"vitess.io/vitess/go/netutil"
"vitess.io/vitess/go/trace"
"vitess.io/vitess/go/vt/log"
"vitess.io/vitess/go/vt/logutil"
topodatapb "vitess.io/vitess/go/vt/proto/topodata"
"vitess.io/vitess/go/vt/topo/events"
@ -207,6 +209,16 @@ func (ti *TabletInfo) IsSlaveType() bool {
return IsSlaveType(ti.Type)
}
// GetMasterTermStartTime returns the tablet's master term start time as a Time value.
func (ti *TabletInfo) GetMasterTermStartTime() time.Time {
return logutil.ProtoToTime(ti.Tablet.MasterTermStartTime)
}
// SetMasterTermStartTime sets the tablet's master term start time as a Time value.
func (ti *TabletInfo) SetMasterTermStartTime(t time.Time) {
ti.Tablet.MasterTermStartTime = logutil.TimeToProto(t)
}
// NewTabletInfo returns a TabletInfo basing on tablet with the
// version set. This function should be only used by Server
// implementations.

Просмотреть файл

@ -0,0 +1,260 @@
/*
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 agreedto 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 topotests
import (
"strings"
"testing"
"time"
"github.com/golang/protobuf/proto"
"golang.org/x/net/context"
topodatapb "vitess.io/vitess/go/vt/proto/topodata"
"vitess.io/vitess/go/vt/topo"
"vitess.io/vitess/go/vt/topo/memorytopo"
)
// waitForInitialShard waits for the initial Shard to appear.
func waitForInitialShard(t *testing.T, ts *topo.Server, keyspace, shard string) (current *topo.WatchShardData, changes <-chan *topo.WatchShardData, cancel topo.CancelFunc) {
ctx := context.Background()
start := time.Now()
for {
current, changes, cancel = ts.WatchShard(ctx, keyspace, shard)
switch {
case topo.IsErrType(current.Err, topo.NoNode):
// hasn't appeared yet
if time.Since(start) > 10*time.Second {
t.Fatalf("time out waiting for file to appear")
}
time.Sleep(10 * time.Millisecond)
continue
case current.Err == nil:
return
default:
t.Fatalf("watch failed: %v", current.Err)
}
}
}
func TestWatchShardNoNode(t *testing.T) {
keyspace := "ks1"
shard := "0"
ctx := context.Background()
ts := memorytopo.NewServer("cell1")
// No Shard -> ErrNoNode
current, _, _ := ts.WatchShard(ctx, keyspace, shard)
if !topo.IsErrType(current.Err, topo.NoNode) {
t.Errorf("Got invalid result from WatchShard(not there): %v", current.Err)
}
}
func TestWatchShard(t *testing.T) {
cell := "cell1"
keyspace := "ks1"
shard := "0"
ctx := context.Background()
ts := memorytopo.NewServer(cell)
// Create keyspace
if err := ts.CreateKeyspace(ctx, keyspace, &topodatapb.Keyspace{}); err != nil {
t.Fatalf("CreateKeyspace %v failed: %v", keyspace, err)
}
// Create initial value
if err := ts.CreateShard(ctx, keyspace, shard); err != nil {
t.Fatalf("Create(/keyspaces/ks1/shards/0/Shard) failed: %v", err)
}
// Starting the watch should now work, and return an empty
// Shard.
// Shards are always created with IsMasterServing true
wanted := &topodatapb.Shard{IsMasterServing: true}
current, changes, cancel := waitForInitialShard(t, ts, keyspace, shard)
if !proto.Equal(current.Value, wanted) {
t.Fatalf("got bad data: %v expected: %v", current.Value, wanted)
}
// Update the value with good data, wait until we see it
wanted.IsMasterServing = false
if _, err := ts.UpdateShardFields(ctx, keyspace, shard, func(si *topo.ShardInfo) error {
si.IsMasterServing = false
return nil
}); err != nil {
t.Fatalf("Update(/keyspaces/ks1/shards/0/Shard) failed: %v", err)
}
for {
wd, ok := <-changes
if !ok {
t.Fatalf("watch channel unexpectedly closed")
}
if wd.Err != nil {
t.Fatalf("watch channel unexpectedly got error: %v", wd.Err)
}
if proto.Equal(wd.Value, wanted) {
break
}
if proto.Equal(wd.Value, &topodatapb.Shard{}) {
t.Log("got duplicate empty value, skipping.")
}
t.Fatalf("got bad data: %v expected: %v", wd.Value, wanted)
}
conn, err := ts.ConnForCell(ctx, "global")
if err != nil {
t.Fatalf("ConnForCell failed: %v", err)
}
// Update the value with bad data, wait until error.
if _, err := conn.Update(ctx, "/keyspaces/"+keyspace+"/shards/"+shard+"/Shard", []byte("BAD PROTO DATA"), nil); err != nil {
t.Fatalf("Update(/keyspaces/ks1/shards/0/Shard) failed: %v", err)
}
for {
wd, ok := <-changes
if !ok {
t.Fatalf("watch channel unexpectedly closed")
}
if wd.Err != nil {
if strings.Contains(wd.Err.Error(), "error unpacking Shard object") {
break
}
t.Fatalf("watch channel unexpectedly got unknown error: %v", wd.Err)
}
if !proto.Equal(wd.Value, wanted) {
t.Fatalf("got bad data: %v expected: %v", wd.Value, wanted)
}
t.Log("got duplicate right value, skipping.")
}
// Cancel should still work here, although it does nothing.
cancel()
// Bad data in topo, setting the watch should now fail.
current, _, _ = ts.WatchShard(ctx, keyspace, shard)
if current.Err == nil || !strings.Contains(current.Err.Error(), "error unpacking initial Shard object") {
t.Fatalf("expected an initial error setting watch on bad content, but got: %v", current.Err)
}
data, err := proto.Marshal(wanted)
if err != nil {
t.Fatalf("error marshalling proto data: %v", err)
}
// Update content, wait until Watch works again
if _, err := conn.Update(ctx, "/keyspaces/"+keyspace+"/shards/"+shard+"/Shard", data, nil); err != nil {
t.Fatalf("Update(/keyspaces/ks1/shards/0/Shard) failed: %v", err)
}
start := time.Now()
for {
current, changes, _ = ts.WatchShard(ctx, keyspace, shard)
if current.Err != nil {
if strings.Contains(current.Err.Error(), "error unpacking initial Shard object") {
// hasn't changed yet
if time.Since(start) > 10*time.Second {
t.Fatalf("time out waiting for file to appear")
}
time.Sleep(10 * time.Millisecond)
continue
}
t.Fatalf("got unexpected error while setting watch: %v", err)
}
if !proto.Equal(current.Value, wanted) {
t.Fatalf("got bad data: %v expected: %v", current.Value, wanted)
}
break
}
// Delete node, wait for error (skip any duplicate).
if err := ts.DeleteShard(ctx, keyspace, shard); err != nil {
t.Fatalf("DeleteShard() failed: %v", err)
}
for {
wd, ok := <-changes
if !ok {
t.Fatalf("watch channel unexpectedly closed")
}
if topo.IsErrType(wd.Err, topo.NoNode) {
break
}
if wd.Err != nil {
t.Fatalf("watch channel unexpectedly got unknown error: %v", wd.Err)
}
if !proto.Equal(wd.Value, wanted) {
t.Fatalf("got bad data: %v expected: %v", wd.Value, wanted)
}
t.Log("got duplicate right value, skipping.")
}
}
func TestWatchShardCancel(t *testing.T) {
cell := "cell1"
keyspace := "ks1"
shard := "0"
ctx := context.Background()
ts := memorytopo.NewServer(cell)
// No Shard -> ErrNoNode
current, _, _ := ts.WatchShard(ctx, keyspace, shard)
if !topo.IsErrType(current.Err, topo.NoNode) {
t.Errorf("Got invalid result from WatchShard(not there): %v", current.Err)
}
// Create keyspace
if err := ts.CreateKeyspace(ctx, keyspace, &topodatapb.Keyspace{}); err != nil {
t.Fatalf("CreateKeyspace %v failed: %v", keyspace, err)
}
// Create initial value
if err := ts.CreateShard(ctx, keyspace, shard); err != nil {
t.Fatalf("Create(/keyspaces/ks1/shards/0/Shard) failed: %v", err)
}
wanted := &topodatapb.Shard{
IsMasterServing: false,
}
if _, err := ts.UpdateShardFields(ctx, keyspace, shard, func(si *topo.ShardInfo) error {
si.IsMasterServing = false
return nil
}); err != nil {
t.Fatalf("UpdateShardFields() failed: %v", err)
}
// Starting the watch should now work.
current, changes, cancel := waitForInitialShard(t, ts, keyspace, shard)
if !proto.Equal(current.Value, wanted) {
t.Fatalf("got bad data: %v expected: %v", current.Value, wanted)
}
// Cancel watch, wait for error.
cancel()
for {
wd, ok := <-changes
if !ok {
t.Fatalf("watch channel unexpectedly closed")
}
if topo.IsErrType(wd.Err, topo.Interrupted) {
break
}
if wd.Err != nil {
t.Fatalf("watch channel unexpectedly got unknown error: %v", wd.Err)
}
if !proto.Equal(wd.Value, wanted) {
t.Fatalf("got bad data: %v expected: %v", wd.Value, wanted)
}
t.Log("got duplicate right value, skipping.")
}
// Cancel should still work here, although it does nothing.
cancel()
}

Просмотреть файл

@ -37,6 +37,7 @@ import (
"errors"
"fmt"
"github.com/golang/protobuf/proto"
"golang.org/x/net/context"
"vitess.io/vitess/go/vt/hook"
@ -46,6 +47,7 @@ import (
querypb "vitess.io/vitess/go/vt/proto/query"
topodatapb "vitess.io/vitess/go/vt/proto/topodata"
"vitess.io/vitess/go/vt/proto/vttime"
)
// ConfigureTabletHook configures the right parameters for a hook
@ -61,11 +63,27 @@ func ConfigureTabletHook(hk *hook.Hook, tabletAlias *topodatapb.TabletAlias) {
// transitions need to be forced from time to time.
//
// If successful, the updated tablet record is returned.
func ChangeType(ctx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, newType topodatapb.TabletType) (*topodatapb.Tablet, error) {
return ts.UpdateTabletFields(ctx, tabletAlias, func(tablet *topodatapb.Tablet) error {
func ChangeType(ctx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, newType topodatapb.TabletType, masterTermStartTime *vttime.Time) (*topodatapb.Tablet, error) {
var result *topodatapb.Tablet
// Always clear out the master timestamp if not master.
if newType != topodatapb.TabletType_MASTER {
masterTermStartTime = nil
}
_, err := ts.UpdateTabletFields(ctx, tabletAlias, func(tablet *topodatapb.Tablet) error {
// Save the most recent tablet value so we can return it
// either if the update succeeds or if no update is needed.
result = tablet
if tablet.Type == newType && proto.Equal(tablet.MasterTermStartTime, masterTermStartTime) {
return topo.NewError(topo.NoUpdateNeeded, topoproto.TabletAliasString(tabletAlias))
}
tablet.Type = newType
tablet.MasterTermStartTime = masterTermStartTime
return nil
})
if err != nil {
return nil, err
}
return result, nil
}
// CheckOwnership returns nil iff the Hostname and port match on oldTablet and

Просмотреть файл

@ -490,6 +490,12 @@ func (itc *internalTabletConn) VStreamRows(ctx context.Context, target *querypb.
return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err))
}
// VStreamResults is part of the QueryService interface.
func (itc *internalTabletConn) VStreamResults(ctx context.Context, target *querypb.Target, query string, send func(*binlogdatapb.VStreamResultsResponse) error) error {
err := itc.tablet.qsc.QueryService().VStreamResults(ctx, target, query, send)
return tabletconn.ErrorFromGRPC(vterrors.ToGRPC(err))
}
//
// TabletManagerClient implementation
//
@ -630,6 +636,10 @@ func (itmc *internalTabletManagerClient) MasterPosition(ctx context.Context, tab
return "", fmt.Errorf("not implemented in vtcombo")
}
func (itmc *internalTabletManagerClient) WaitForPosition(ctx context.Context, tablet *topodatapb.Tablet, pos string) error {
return fmt.Errorf("not implemented in vtcombo")
}
func (itmc *internalTabletManagerClient) StopSlave(ctx context.Context, tablet *topodatapb.Tablet) error {
return fmt.Errorf("not implemented in vtcombo")
}
@ -694,7 +704,7 @@ func (itmc *internalTabletManagerClient) SlaveWasPromoted(ctx context.Context, t
return fmt.Errorf("not implemented in vtcombo")
}
func (itmc *internalTabletManagerClient) SetMaster(ctx context.Context, tablet *topodatapb.Tablet, parent *topodatapb.TabletAlias, timeCreatedNS int64, forceStartSlave bool) error {
func (itmc *internalTabletManagerClient) SetMaster(ctx context.Context, tablet *topodatapb.Tablet, parent *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartSlave bool) error {
return fmt.Errorf("not implemented in vtcombo")
}

Просмотреть файл

@ -45,13 +45,19 @@ func init() {
addCommand("Shards", command{
"PlannedReparentShard",
commandPlannedReparentShard,
"-keyspace_shard=<keyspace/shard> [-new_master=<tablet alias>] [-avoid_master=<tablet alias>]",
"-keyspace_shard=<keyspace/shard> [-new_master=<tablet alias>] [-avoid_master=<tablet alias>] [-wait_slave_timeout=<duration>]",
"Reparents the shard to the new master, or away from old master. Both old and new master need to be up and running."})
addCommand("Shards", command{
"EmergencyReparentShard",
commandEmergencyReparentShard,
"-keyspace_shard=<keyspace/shard> -new_master=<tablet alias>",
"Reparents the shard to the new master. Assumes the old master is dead and not responsding."})
addCommand("Shards", command{
"TabletExternallyReparented",
commandTabletExternallyReparented,
"<tablet alias>",
"Changes metadata in the topology server to acknowledge a shard master change performed by an external tool. See the Reparenting guide for more information:" +
"https://vitess.io/docs/user-guides/reparenting/#external-reparenting"})
}
func commandReparentTablet(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error {
@ -101,7 +107,7 @@ func commandPlannedReparentShard(ctx context.Context, wr *wrangler.Wrangler, sub
return fmt.Errorf("active reparent commands disabled (unset the -disable_active_reparents flag to enable)")
}
waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", *topo.RemoteOperationTimeout, "time to wait for slaves to catch up in reparenting")
waitSlaveTimeout := subFlags.Duration("wait_slave_timeout", *topo.RemoteOperationTimeout, "time to wait for replicas to catch up on replication before and after reparenting")
keyspaceShard := subFlags.String("keyspace_shard", "", "keyspace/shard of the shard that needs to be reparented")
newMaster := subFlags.String("new_master", "", "alias of a tablet that should be the new master")
avoidMaster := subFlags.String("avoid_master", "", "alias of a tablet that should not be the master, i.e. reparent to any other tablet if this one is the master")
@ -171,3 +177,18 @@ func commandEmergencyReparentShard(ctx context.Context, wr *wrangler.Wrangler, s
}
return wr.EmergencyReparentShard(ctx, keyspace, shard, tabletAlias, *waitSlaveTimeout)
}
func commandTabletExternallyReparented(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error {
if err := subFlags.Parse(args); err != nil {
return err
}
if subFlags.NArg() != 1 {
return fmt.Errorf("action TabletExternallyReparented requires <tablet alias>")
}
tabletAlias, err := topoproto.ParseTabletAlias(subFlags.Arg(0))
if err != nil {
return err
}
return wr.TabletExternallyReparented(ctx, tabletAlias)
}

Просмотреть файл

@ -231,10 +231,6 @@ var commands = []commandGroup{
{"GetShard", commandGetShard,
"<keyspace/shard>",
"Outputs a JSON structure that contains information about the Shard."},
{"TabletExternallyReparented", commandTabletExternallyReparented,
"<tablet alias>",
"Changes metadata in the topology server to acknowledge a shard master change performed by an external tool. See the Reparenting guide for more information:" +
"https://github.com/vitessio/vitess/blob/master/doc/Reparenting.md#external-reparents."},
{"ValidateShard", commandValidateShard,
"[-ping-tablets] <keyspace/shard>",
"Validates that all nodes that are reachable from this shard are consistent."},
@ -317,6 +313,9 @@ var commands = []commandGroup{
{"VerticalSplitClone", commandVerticalSplitClone,
"<from_keyspace> <to_keyspace> <tables>",
"Start the VerticalSplitClone process to perform vertical resharding. Example: SplitClone from_ks to_ks 'a,/b.*/'"},
{"VDiff", commandVDiff,
"-workflow=<workflow> <target keyspace> [-source_cell=<cell>] [-target_cell=<cell>] [-tablet_types=REPLICA] [-filtered_replication_wait_time=30s]",
"Perform a diff of all tables in the workflow"},
{"MigrateServedTypes", commandMigrateServedTypes,
"[-cells=c1,c2,...] [-reverse] [-skip-refresh-state] <keyspace/shard> <served tablet type>",
"Migrates a serving type from the source shard to the shards that it replicates to. This command also rebuilds the serving graph. The <keyspace/shard> argument can specify any of the shards involved in the migration."},
@ -327,7 +326,7 @@ var commands = []commandGroup{
"[-cells=c1,c2,...] [-reverse] -workflow=workflow <target keyspace> <tablet type>",
"Migrate read traffic for the specified workflow."},
{"MigrateWrites", commandMigrateWrites,
"[-filtered_replication_wait_time=30s] [-reverse_replication=<true/false>] -workflow=workflow <target keyspace>",
"[-filtered_replication_wait_time=30s] [-cancel] [-reverse_replication=false] -workflow=workflow <target keyspace>",
"Migrate write traffic for the specified workflow."},
{"CancelResharding", commandCancelResharding,
"<keyspace/shard>",
@ -1206,25 +1205,6 @@ func commandGetShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.
return printJSON(wr.Logger(), shardInfo.Shard)
}
func commandTabletExternallyReparented(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error {
if err := subFlags.Parse(args); err != nil {
return err
}
if subFlags.NArg() != 1 {
return fmt.Errorf("the <tablet alias> argument is required for the TabletExternallyReparented command")
}
tabletAlias, err := topoproto.ParseTabletAlias(subFlags.Arg(0))
if err != nil {
return err
}
ti, err := wr.TopoServer().GetTablet(ctx, tabletAlias)
if err != nil {
return err
}
return wr.TabletManagerClient().TabletExternallyReparented(ctx, ti.Tablet, "")
}
func commandValidateShard(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error {
pingTablets := subFlags.Bool("ping-tablets", true, "Indicates whether all tablets should be pinged during the validation process")
if err := subFlags.Parse(args); err != nil {
@ -1830,6 +1810,25 @@ func commandVerticalSplitClone(ctx context.Context, wr *wrangler.Wrangler, subFl
return wr.VerticalSplitClone(ctx, fromKeyspace, toKeyspace, tables)
}
func commandVDiff(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error {
workflow := subFlags.String("workflow", "", "Specifies the workflow name")
sourceCell := subFlags.String("source_cell", "", "The source cell to compare from")
targetCell := subFlags.String("target_cell", "", "The target cell to compare with")
tabletTypes := subFlags.String("tablet_types", "", "Tablet types for source and target")
filteredReplicationWaitTime := subFlags.Duration("filtered_replication_wait_time", 30*time.Second, "Specifies the maximum time to wait, in seconds, for filtered replication to catch up on master migrations. The migration will be aborted on timeout.")
if err := subFlags.Parse(args); err != nil {
return err
}
if subFlags.NArg() != 1 {
return fmt.Errorf("the <target keyspace> is required")
}
targetKeyspace := subFlags.Arg(0)
_, err := wr.VDiff(ctx, targetKeyspace, *workflow, *sourceCell, *targetCell, *tabletTypes, *filteredReplicationWaitTime,
*HealthCheckTopologyRefresh, *HealthcheckRetryDelay, *HealthCheckTimeout)
return err
}
func commandMigrateServedTypes(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error {
cellsStr := subFlags.String("cells", "", "Specifies a comma-separated list of cells to update")
reverse := subFlags.Bool("reverse", false, "Moves the served tablet type backward instead of forward.")
@ -1920,6 +1919,7 @@ func commandMigrateReads(ctx context.Context, wr *wrangler.Wrangler, subFlags *f
func commandMigrateWrites(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.FlagSet, args []string) error {
filteredReplicationWaitTime := subFlags.Duration("filtered_replication_wait_time", 30*time.Second, "Specifies the maximum time to wait, in seconds, for filtered replication to catch up on master migrations. The migration will be aborted on timeout.")
reverseReplication := subFlags.Bool("reverse_replication", true, "Also reverse the replication")
cancelMigrate := subFlags.Bool("cancel", false, "Cancel the failed migration and serve from source")
workflow := subFlags.String("workflow", "", "Specifies the workflow name")
if err := subFlags.Parse(args); err != nil {
return err
@ -1932,7 +1932,7 @@ func commandMigrateWrites(ctx context.Context, wr *wrangler.Wrangler, subFlags *
if *workflow == "" {
return fmt.Errorf("a -workflow=workflow argument is required")
}
journalID, err := wr.MigrateWrites(ctx, keyspace, *workflow, *filteredReplicationWaitTime, *reverseReplication)
journalID, err := wr.MigrateWrites(ctx, keyspace, *workflow, *filteredReplicationWaitTime, *cancelMigrate, *reverseReplication)
if err != nil {
return err
}

Просмотреть файл

@ -161,6 +161,7 @@ func TestAPI(t *testing.T) {
{"GET", "shards/ks1/", "", `["-80","80-"]`},
{"GET", "shards/ks1/-80", "", `{
"master_alias": null,
"master_term_start_time":null,
"key_range": {
"start": null,
"end":"gA=="
@ -204,7 +205,8 @@ func TestAPI(t *testing.T) {
"db_name_override": "",
"tags": {},
"mysql_hostname":"",
"mysql_port":0
"mysql_port":0,
"master_term_start_time":null
}`},
{"GET", "tablets/nonexistent-999", "", "404 page not found"},
{"POST", "tablets/cell1-100?action=TestTabletAction", "", `{

Просмотреть файл

@ -390,34 +390,49 @@ func (ins *Insert) getInsertShardedRoute(vcursor VCursor, bindVars map[string]*q
// The output from the following 'process' functions is a list of
// keyspace ids. For regular inserts, a failure to find a route
// results in an error. For 'ignore' type inserts, the keyspace
// id is returned as nil, which is used later to drop such rows.
keyspaceIDs, err := ins.processPrimary(vcursor, vindexRowsValues[0], ins.Table.ColumnVindexes[0], bindVars)
// id is returned as nil, which is used later to drop the corresponding rows.
colVindex := ins.Table.ColumnVindexes[0]
keyspaceIDs, err := ins.processPrimary(vcursor, vindexRowsValues[0], colVindex)
if err != nil {
return nil, nil, vterrors.Wrap(err, "getInsertShardedRoute")
}
// Primary vindex can be owned. If so, go through the processOwned flow.
// If not owned, we don't do processUnowned because there's no need to verify
// the keyspace ids we just generated.
if colVindex.Owned {
if err := ins.processOwned(vcursor, vindexRowsValues[0], colVindex, keyspaceIDs); err != nil {
return nil, nil, vterrors.Wrap(err, "getInsertShardedRoute")
}
}
for vIdx := 1; vIdx < len(vindexRowsValues); vIdx++ {
for vIdx := 1; vIdx < len(ins.Table.ColumnVindexes); vIdx++ {
colVindex := ins.Table.ColumnVindexes[vIdx]
var err error
if colVindex.Owned {
switch ins.Opcode {
case InsertSharded:
err = ins.processOwned(vcursor, vindexRowsValues[vIdx], colVindex, bindVars, keyspaceIDs)
case InsertShardedIgnore:
// For InsertShardedIgnore, the work is substantially different.
// So, we use a separate function.
err = ins.processOwnedIgnore(vcursor, vindexRowsValues[vIdx], colVindex, bindVars, keyspaceIDs)
default:
err = vterrors.Errorf(vtrpcpb.Code_INTERNAL, "BUG: unexpected opcode: %v", ins.Opcode)
}
err = ins.processOwned(vcursor, vindexRowsValues[vIdx], colVindex, keyspaceIDs)
} else {
err = ins.processUnowned(vcursor, vindexRowsValues[vIdx], colVindex, bindVars, keyspaceIDs)
err = ins.processUnowned(vcursor, vindexRowsValues[vIdx], colVindex, keyspaceIDs)
}
if err != nil {
return nil, nil, vterrors.Wrap(err, "getInsertShardedRoute")
}
}
// Build 3-d bindvars. Skip rows with nil keyspace ids in case
// we're executing an insert ignore.
for vIdx, colVindex := range ins.Table.ColumnVindexes {
for rowNum, rowColumnKeys := range vindexRowsValues[vIdx] {
if keyspaceIDs[rowNum] == nil {
// InsertShardedIgnore: skip the row.
continue
}
for colIdx, vindexKey := range rowColumnKeys {
col := colVindex.Columns[colIdx]
bindVars[insertVarName(col, rowNum)] = sqltypes.ValueBindVariable(vindexKey)
}
}
}
// We need to know the keyspace ids and the Mids associated with
// each RSS. So we pass the ksid indexes in as ids, and get them back
// as values. We also skip nil KeyspaceIds, no need to resolve them.
@ -465,14 +480,8 @@ func (ins *Insert) getInsertShardedRoute(vcursor VCursor, bindVars map[string]*q
}
// processPrimary maps the primary vindex values to the keyspace ids.
func (ins *Insert) processPrimary(vcursor VCursor, vindexKeys [][]sqltypes.Value, colVindex *vindexes.ColumnVindex, bv map[string]*querypb.BindVariable) ([][]byte, error) {
var flattenedVindexKeys []sqltypes.Value
// TODO: @rafael - this will change once vindex Primary keys also support multicolumns
for _, val := range vindexKeys {
flattenedVindexKeys = append(flattenedVindexKeys, val...)
}
destinations, err := colVindex.Vindex.Map(vcursor, flattenedVindexKeys)
func (ins *Insert) processPrimary(vcursor VCursor, vindexColumnsKeys [][]sqltypes.Value, colVindex *vindexes.ColumnVindex) ([][]byte, error) {
destinations, err := vindexes.Map(colVindex.Vindex, vcursor, vindexColumnsKeys)
if err != nil {
return nil, err
}
@ -486,56 +495,34 @@ func (ins *Insert) processPrimary(vcursor VCursor, vindexKeys [][]sqltypes.Value
case key.DestinationNone:
// No valid keyspace id, we may return an error.
if ins.Opcode != InsertShardedIgnore {
return nil, fmt.Errorf("could not map %v to a keyspace id", flattenedVindexKeys[i])
return nil, fmt.Errorf("could not map %v to a keyspace id", vindexColumnsKeys[i])
}
default:
return nil, fmt.Errorf("could not map %v to a unique keyspace id: %v", flattenedVindexKeys[i], destination)
return nil, fmt.Errorf("could not map %v to a unique keyspace id: %v", vindexColumnsKeys[i], destination)
}
}
for rowNum, vindexKey := range flattenedVindexKeys {
if keyspaceIDs[rowNum] == nil {
// InsertShardedIgnore: skip the row.
continue
}
for _, col := range colVindex.Columns {
bv[insertVarName(col, rowNum)] = sqltypes.ValueBindVariable(vindexKey)
}
}
return keyspaceIDs, nil
}
// processOwned creates vindex entries for the values of an owned column for InsertSharded.
func (ins *Insert) processOwned(vcursor VCursor, vindexColumnsKeys [][]sqltypes.Value, colVindex *vindexes.ColumnVindex, bv map[string]*querypb.BindVariable, ksids [][]byte) error {
for rowNum, rowColumnKeys := range vindexColumnsKeys {
for colIdx, vindexKey := range rowColumnKeys {
col := colVindex.Columns[colIdx]
bv[insertVarName(col, rowNum)] = sqltypes.ValueBindVariable(vindexKey)
}
// processOwned creates vindex entries for the values of an owned column.
func (ins *Insert) processOwned(vcursor VCursor, vindexColumnsKeys [][]sqltypes.Value, colVindex *vindexes.ColumnVindex, ksids [][]byte) error {
if ins.Opcode == InsertSharded {
return colVindex.Vindex.(vindexes.Lookup).Create(vcursor, vindexColumnsKeys, ksids, false /* ignoreMode */)
}
return colVindex.Vindex.(vindexes.Lookup).Create(vcursor, vindexColumnsKeys, ksids, false /* ignoreMode */)
}
// processOwnedIgnore creates vindex entries for the values of an owned column for InsertShardedIgnore.
func (ins *Insert) processOwnedIgnore(vcursor VCursor, vindexColumnsKeys [][]sqltypes.Value, colVindex *vindexes.ColumnVindex, bv map[string]*querypb.BindVariable, ksids [][]byte) error {
// InsertShardedIgnore
var createIndexes []int
var createKeys [][]sqltypes.Value
var createKsids [][]byte
for rowNum, rowColumnKeys := range vindexColumnsKeys {
var rowKeys []sqltypes.Value
if ksids[rowNum] == nil {
continue
}
createIndexes = append(createIndexes, rowNum)
createKeys = append(createKeys, rowColumnKeys)
createKsids = append(createKsids, ksids[rowNum])
for colIdx, vindexKey := range rowColumnKeys {
rowKeys = append(rowKeys, vindexKey)
col := colVindex.Columns[colIdx]
bv[insertVarName(col, rowNum)] = sqltypes.ValueBindVariable(vindexKey)
}
createKeys = append(createKeys, rowKeys)
}
if createKeys == nil {
return nil
@ -547,12 +534,7 @@ func (ins *Insert) processOwnedIgnore(vcursor VCursor, vindexColumnsKeys [][]sql
}
// After creation, verify that the keys map to the keyspace ids. If not, remove
// those that don't map.
// If values were supplied, we validate against keyspace id.
var ids []sqltypes.Value
for _, vindexValues := range createKeys {
ids = append(ids, vindexValues[0])
}
verified, err := colVindex.Vindex.Verify(vcursor, ids, createKsids)
verified, err := vindexes.Verify(colVindex.Vindex, vcursor, createKeys, createKsids)
if err != nil {
return err
}
@ -565,26 +547,26 @@ func (ins *Insert) processOwnedIgnore(vcursor VCursor, vindexColumnsKeys [][]sql
}
// processUnowned either reverse maps or validates the values for an unowned column.
func (ins *Insert) processUnowned(vcursor VCursor, vindexColumnsKeys [][]sqltypes.Value, colVindex *vindexes.ColumnVindex, bv map[string]*querypb.BindVariable, ksids [][]byte) error {
func (ins *Insert) processUnowned(vcursor VCursor, vindexColumnsKeys [][]sqltypes.Value, colVindex *vindexes.ColumnVindex, ksids [][]byte) error {
var reverseIndexes []int
var reverseKsids [][]byte
var verifyIndexes []int
var verifyKeys []sqltypes.Value
var verifyKeys [][]sqltypes.Value
var verifyKsids [][]byte
for rowNum, rowColumnKeys := range vindexColumnsKeys {
// Right now, we only validate against the first column of a colvindex.
// TODO(sougou): address this when we add multicolumn Map support.
vindexKey := rowColumnKeys[0]
if ksids[rowNum] == nil {
continue
}
if vindexKey.IsNull() {
// Perform reverse map only for non-multi-column vindexes.
_, isMulti := colVindex.Vindex.(vindexes.MultiColumn)
if rowColumnKeys[0].IsNull() && !isMulti {
reverseIndexes = append(reverseIndexes, rowNum)
reverseKsids = append(reverseKsids, ksids[rowNum])
} else {
verifyIndexes = append(verifyIndexes, rowNum)
verifyKeys = append(verifyKeys, vindexKey)
verifyKeys = append(verifyKeys, rowColumnKeys)
verifyKsids = append(verifyKsids, ksids[rowNum])
}
}
@ -601,38 +583,26 @@ func (ins *Insert) processUnowned(vcursor VCursor, vindexColumnsKeys [][]sqltype
return err
}
for i, reverseKey := range reverseKeys {
rowNum := reverseIndexes[i]
for colIdx, col := range colVindex.Columns {
if colIdx == 0 {
// Fill the first column with the reverse-mapped value.
bv[insertVarName(col, rowNum)] = sqltypes.ValueBindVariable(reverseKey)
} else {
// Fill other columns with supplied values.
bv[insertVarName(col, rowNum)] = sqltypes.ValueBindVariable(vindexColumnsKeys[rowNum][colIdx])
}
}
// Fill the first column with the reverse-mapped value.
vindexColumnsKeys[reverseIndexes[i]][0] = reverseKey
}
}
if verifyKsids != nil {
// If values were supplied, we validate against keyspace id.
verified, err := colVindex.Vindex.Verify(vcursor, verifyKeys, verifyKsids)
verified, err := vindexes.Verify(colVindex.Vindex, vcursor, verifyKeys, verifyKsids)
if err != nil {
return err
}
for i, v := range verified {
rowNum := verifyIndexes[i]
if !v {
if ins.Opcode != InsertShardedIgnore {
return fmt.Errorf("values %v for column %v does not map to keyspace ids", vindexColumnsKeys, colVindex.Columns)
}
// InsertShardedIgnore: skip the row.
ksids[rowNum] = nil
ksids[verifyIndexes[i]] = nil
continue
}
for colIdx, col := range colVindex.Columns {
bv[insertVarName(col, rowNum)] = sqltypes.ValueBindVariable(vindexColumnsKeys[rowNum][colIdx])
}
}
}
return nil

Просмотреть файл

@ -20,6 +20,7 @@ import (
"errors"
"testing"
"github.com/stretchr/testify/assert"
"vitess.io/vitess/go/sqltypes"
"vitess.io/vitess/go/vt/vtgate/vindexes"
@ -318,7 +319,7 @@ func TestInsertShardedFail(t *testing.T) {
// The lookup will fail to map to a keyspace id.
_, err = ins.Execute(vc, map[string]*querypb.BindVariable{}, false)
expectError(t, "Execute", err, "execInsertSharded: getInsertShardedRoute: could not map INT64(1) to a keyspace id")
expectError(t, "Execute", err, "execInsertSharded: getInsertShardedRoute: could not map [INT64(1)] to a keyspace id")
}
func TestInsertShardedGenerate(t *testing.T) {
@ -644,6 +645,92 @@ func TestInsertShardedOwnedWithNull(t *testing.T) {
})
}
func TestInsertShardedGeo(t *testing.T) {
invschema := &vschemapb.SrvVSchema{
Keyspaces: map[string]*vschemapb.Keyspace{
"sharded": {
Sharded: true,
Vindexes: map[string]*vschemapb.Vindex{
"geo": {
Type: "region_experimental",
Params: map[string]string{
"region_bytes": "1",
"table": "lkp",
"from": "id,region",
"to": "toc",
},
Owner: "t1",
},
},
Tables: map[string]*vschemapb.Table{
"t1": {
ColumnVindexes: []*vschemapb.ColumnVindex{{
Name: "geo",
Columns: []string{"id", "region"},
}},
},
},
},
},
}
vs, err := vindexes.BuildVSchema(invschema)
if err != nil {
t.Fatal(err)
}
ks := vs.Keyspaces["sharded"]
ins := NewInsert(
InsertSharded,
ks.Keyspace,
[]sqltypes.PlanValue{{
// colVindex columns: id, region
Values: []sqltypes.PlanValue{{
// rows for id
Values: []sqltypes.PlanValue{{
Value: sqltypes.NewInt64(1),
}, {
Value: sqltypes.NewInt64(1),
}},
}, {
// rows for region
Values: []sqltypes.PlanValue{{
Value: sqltypes.NewInt64(1),
}, {
Value: sqltypes.NewInt64(255),
}},
}},
}},
ks.Tables["t1"],
"prefix",
[]string{" mid1", " mid2"},
" suffix",
)
vc := &loggingVCursor{
shards: []string{"-20", "20-"},
shardForKsid: []string{"20-", "-20"},
}
_, err = ins.Execute(vc, map[string]*querypb.BindVariable{}, false)
if err != nil {
t.Fatal(err)
}
vc.ExpectLog(t, []string{
// ExecutePre proves that keyspace ids are generated, and that they are inserted into the lookup.
`ExecutePre insert into lkp(id, region, toc) values(:id0, :region0, :toc0), (:id1, :region1, :toc1) ` +
`id0: type:INT64 value:"1" id1: type:INT64 value:"1" ` +
`region0: type:INT64 value:"1" region1: type:INT64 value:"255" ` +
`toc0: type:VARBINARY value:"\001\026k@\264J\272K\326" toc1: type:VARBINARY value:"\377\026k@\264J\272K\326" true`,
`ResolveDestinations sharded [value:"0" value:"1" ] Destinations:DestinationKeyspaceID(01166b40b44aba4bd6),DestinationKeyspaceID(ff166b40b44aba4bd6)`,
`ExecuteMultiShard sharded.20-: prefix mid1 suffix /* vtgate:: keyspace_id:01166b40b44aba4bd6 */ ` +
`{_id0: type:INT64 value:"1" _id1: type:INT64 value:"1" ` +
`_region0: type:INT64 value:"1" _region1: type:INT64 value:"255" } ` +
`sharded.-20: prefix mid2 suffix /* vtgate:: keyspace_id:ff166b40b44aba4bd6 */ ` +
`{_id0: type:INT64 value:"1" _id1: type:INT64 value:"1" ` +
`_region0: type:INT64 value:"1" _region1: type:INT64 value:"255" } ` +
`true false`,
})
}
func TestInsertShardedIgnoreOwned(t *testing.T) {
invschema := &vschemapb.SrvVSchema{
Keyspaces: map[string]*vschemapb.Keyspace{
@ -822,19 +909,117 @@ func TestInsertShardedIgnoreOwned(t *testing.T) {
// Bind vars for rows 2 & 3 may be missing because they were not sent.
`ExecuteMultiShard ` +
`sharded.20-: prefix mid1 suffix /* vtgate:: keyspace_id:00 */ ` +
`{_c10: type:INT64 value:"5" _c12: type:INT64 value:"7" _c13: type:INT64 value:"8" ` +
`_c20: type:INT64 value:"9" _c22: type:INT64 value:"11" _c23: type:INT64 value:"12" ` +
`{_c10: type:INT64 value:"5" _c13: type:INT64 value:"8" ` +
`_c20: type:INT64 value:"9" _c23: type:INT64 value:"12" ` +
`_c30: type:INT64 value:"13" _c33: type:INT64 value:"16" ` +
`_id0: type:INT64 value:"1" _id2: type:INT64 value:"3" _id3: type:INT64 value:"4" } ` +
`_id0: type:INT64 value:"1" _id3: type:INT64 value:"4" } ` +
`sharded.-20: prefix mid4 suffix /* vtgate:: keyspace_id:00 */ ` +
`{_c10: type:INT64 value:"5" _c12: type:INT64 value:"7" _c13: type:INT64 value:"8" ` +
`_c20: type:INT64 value:"9" _c22: type:INT64 value:"11" _c23: type:INT64 value:"12" ` +
`{_c10: type:INT64 value:"5" _c13: type:INT64 value:"8" ` +
`_c20: type:INT64 value:"9" _c23: type:INT64 value:"12" ` +
`_c30: type:INT64 value:"13" _c33: type:INT64 value:"16" ` +
`_id0: type:INT64 value:"1" _id2: type:INT64 value:"3" _id3: type:INT64 value:"4" } ` +
`_id0: type:INT64 value:"1" _id3: type:INT64 value:"4" } ` +
`true false`,
})
}
func TestInsertIgnoreGeo(t *testing.T) {
invschema := &vschemapb.SrvVSchema{
Keyspaces: map[string]*vschemapb.Keyspace{
"sharded": {
Sharded: true,
Vindexes: map[string]*vschemapb.Vindex{
"geo": {
Type: "region_experimental",
Params: map[string]string{
"region_bytes": "1",
"table": "lkp",
"from": "id,region",
"to": "toc",
},
Owner: "t1",
},
},
Tables: map[string]*vschemapb.Table{
"t1": {
ColumnVindexes: []*vschemapb.ColumnVindex{{
Name: "geo",
Columns: []string{"id", "region"},
}},
},
},
},
},
}
vs, err := vindexes.BuildVSchema(invschema)
if err != nil {
t.Fatal(err)
}
ks := vs.Keyspaces["sharded"]
ins := NewInsert(
InsertShardedIgnore,
ks.Keyspace,
[]sqltypes.PlanValue{{
// colVindex columns: id, region
Values: []sqltypes.PlanValue{{
// rows for id
Values: []sqltypes.PlanValue{{
Value: sqltypes.NewInt64(1),
}, {
Value: sqltypes.NewInt64(2),
}},
}, {
// rows for region
Values: []sqltypes.PlanValue{{
Value: sqltypes.NewInt64(1),
}, {
Value: sqltypes.NewInt64(2),
}},
}},
}},
ks.Tables["t1"],
"prefix",
[]string{" mid1", " mid2"},
" suffix",
)
ksid0 := sqltypes.MakeTestResult(
sqltypes.MakeTestFields(
"to",
"varbinary",
),
"\x00",
)
noresult := &sqltypes.Result{}
vc := &loggingVCursor{
shards: []string{"-20", "20-"},
shardForKsid: []string{"20-", "-20"},
results: []*sqltypes.Result{
// insert lkp
noresult,
// fail one verification (row 2)
ksid0,
noresult,
},
}
_, err = ins.Execute(vc, map[string]*querypb.BindVariable{}, false)
if err != nil {
t.Fatal(err)
}
vc.ExpectLog(t, []string{
`ExecutePre insert ignore into lkp(id, region, toc) values(:id0, :region0, :toc0), (:id1, :region1, :toc1) ` +
`id0: type:INT64 value:"1" id1: type:INT64 value:"2" ` +
`region0: type:INT64 value:"1" region1: type:INT64 value:"2" ` +
`toc0: type:VARBINARY value:"\001\026k@\264J\272K\326" toc1: type:VARBINARY value:"\002\006\347\352\"\316\222p\217" true`,
// Row 2 will fail verification. This is what we're testing. The second row should not get inserted.
`ExecutePre select id from lkp where id = :id and toc = :toc id: type:INT64 value:"1" toc: type:VARBINARY value:"\001\026k@\264J\272K\326" false`,
`ExecutePre select id from lkp where id = :id and toc = :toc id: type:INT64 value:"2" toc: type:VARBINARY value:"\002\006\347\352\"\316\222p\217" false`,
`ResolveDestinations sharded [value:"0" ] Destinations:DestinationKeyspaceID(01166b40b44aba4bd6)`,
`ExecuteMultiShard sharded.20-: prefix mid1 suffix /* vtgate:: keyspace_id:01166b40b44aba4bd6 */ ` +
`{_id0: type:INT64 value:"1" _region0: type:INT64 value:"1" } true true`,
})
}
func TestInsertShardedIgnoreOwnedWithNull(t *testing.T) {
invschema := &vschemapb.SrvVSchema{
Keyspaces: map[string]*vschemapb.Keyspace{
@ -907,7 +1092,6 @@ func TestInsertShardedIgnoreOwnedWithNull(t *testing.T) {
),
"\x00",
)
//noresult := &sqltypes.Result{}
vc := &loggingVCursor{
shards: []string{"-20", "20-"},
shardForKsid: []string{"-20", "20-"},
@ -1086,6 +1270,91 @@ func TestInsertShardedUnownedVerify(t *testing.T) {
})
}
func TestInsertUnownedGeo(t *testing.T) {
invschema := &vschemapb.SrvVSchema{
Keyspaces: map[string]*vschemapb.Keyspace{
"sharded": {
Sharded: true,
Vindexes: map[string]*vschemapb.Vindex{
"primary": {
Type: "hash",
},
"geo": {
Type: "region_experimental",
Params: map[string]string{
"region_bytes": "1",
"table": "lkp",
"from": "other_id,region",
"to": "toc",
},
},
},
Tables: map[string]*vschemapb.Table{
"t1": {
ColumnVindexes: []*vschemapb.ColumnVindex{{
Name: "primary",
Columns: []string{"id"},
}, {
Name: "geo",
Columns: []string{"other_id", "region"},
}},
},
},
},
},
}
vs, err := vindexes.BuildVSchema(invschema)
if err != nil {
t.Fatal(err)
}
ks := vs.Keyspaces["sharded"]
ins := NewInsert(
InsertSharded,
ks.Keyspace,
[]sqltypes.PlanValue{{
// colVindex columns: id
Values: []sqltypes.PlanValue{{
// rows for id
Values: []sqltypes.PlanValue{{
Value: sqltypes.NewInt64(1),
}},
}},
}, {
// colVindex columns: other_id, region
Values: []sqltypes.PlanValue{{
// rows for other_id
Values: []sqltypes.PlanValue{{
Value: sqltypes.NewInt64(2),
}},
}, {
// rows for region
Values: []sqltypes.PlanValue{{
Value: sqltypes.NewInt64(3),
}},
}},
}},
ks.Tables["t1"],
"prefix",
[]string{" mid1"},
" suffix",
)
noresult := &sqltypes.Result{}
vc := &loggingVCursor{
shards: []string{"-20", "20-"},
results: []*sqltypes.Result{
// fail verification
noresult,
},
}
_, err = ins.Execute(vc, map[string]*querypb.BindVariable{}, false)
assert.EqualError(t, err, "execInsertSharded: getInsertShardedRoute: values [[INT64(2) INT64(3)]] for column [other_id region] does not map to keyspace ids")
vc.ExpectLog(t, []string{
`ExecutePre select other_id from lkp where other_id = :other_id and toc = :toc other_id: type:INT64 value:"2" toc: type:VARBINARY value:"\026k@\264J\272K\326" false`,
})
}
func TestInsertShardedIgnoreUnownedVerify(t *testing.T) {
invschema := &vschemapb.SrvVSchema{
Keyspaces: map[string]*vschemapb.Keyspace{
@ -1192,10 +1461,10 @@ func TestInsertShardedIgnoreUnownedVerify(t *testing.T) {
`ExecuteMultiShard ` +
`sharded.20-: prefix mid1 suffix /* vtgate:: keyspace_id:166b40b44aba4bd6 */ ` +
`{_c30: type:INT64 value:"10" _c32: type:INT64 value:"12" ` +
`_id0: type:INT64 value:"1" _id1: type:INT64 value:"2" _id2: type:INT64 value:"3" } ` +
`_id0: type:INT64 value:"1" _id2: type:INT64 value:"3" } ` +
`sharded.-20: prefix mid3 suffix /* vtgate:: keyspace_id:4eb190c9a2fa169c */ ` +
`{_c30: type:INT64 value:"10" _c32: type:INT64 value:"12" ` +
`_id0: type:INT64 value:"1" _id1: type:INT64 value:"2" _id2: type:INT64 value:"3" } ` +
`_id0: type:INT64 value:"1" _id2: type:INT64 value:"3" } ` +
`true false`,
})
}

Просмотреть файл

@ -30,13 +30,13 @@ import (
"vitess.io/vitess/go/vt/srvtopo"
)
// mergeSort performs a merge-sort of rows returned by a streaming scatter query.
// MergeSort performs a merge-sort of rows returned by a streaming scatter query.
// Each shard of the scatter query is treated as a stream. One row from each stream
// is added to the merge-sorter heap. Every time a value is pulled out of the heap,
// a new value is added to it from the stream that was the source of the value that
// was pulled out. Since the input streams are sorted the same way that the heap is
// sorted, this guarantees that the merged stream will also be sorted the same way.
func mergeSort(vcursor VCursor, query string, orderBy []OrderbyParams, rss []*srvtopo.ResolvedShard, bvs []map[string]*querypb.BindVariable, callback func(*sqltypes.Result) error) error {
func MergeSort(vcursor VCursor, query string, orderBy []OrderbyParams, rss []*srvtopo.ResolvedShard, bvs []map[string]*querypb.BindVariable, callback func(*sqltypes.Result) error) error {
ctx, cancel := context.WithCancel(vcursor.Context())
defer cancel()
@ -123,7 +123,7 @@ func mergeSort(vcursor VCursor, query string, orderBy []OrderbyParams, rss []*sr
// The fields channel is used by the stream to transmit the field info, which
// is the first packet. Following this, the stream sends each row to the row
// channel. At the end of the stream, fields and row are closed. If there
// was an error, err is set before the channels are closed. The mergeSort
// was an error, err is set before the channels are closed. The MergeSort
// routine that pulls the rows out of each streamHandle can abort the stream
// by calling canceling the context.
type streamHandle struct {

Просмотреть файл

@ -65,7 +65,7 @@ func TestMergeSortNormal(t *testing.T) {
bvs := []map[string]*querypb.BindVariable{nil, nil, nil, nil}
var results []*sqltypes.Result
err := mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error {
err := MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error {
results = append(results, qr)
return nil
})
@ -92,7 +92,7 @@ func TestMergeSortNormal(t *testing.T) {
"8|h",
)
if !reflect.DeepEqual(results, wantResults) {
t.Errorf("mergeSort:\n%s, want\n%s", sqltypes.PrintResults(results), sqltypes.PrintResults(wantResults))
t.Errorf("MergeSort:\n%s, want\n%s", sqltypes.PrintResults(results), sqltypes.PrintResults(wantResults))
}
}
@ -135,7 +135,7 @@ func TestMergeSortDescending(t *testing.T) {
bvs := []map[string]*querypb.BindVariable{nil, nil, nil, nil}
var results []*sqltypes.Result
err := mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error {
err := MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error {
results = append(results, qr)
return nil
})
@ -162,7 +162,7 @@ func TestMergeSortDescending(t *testing.T) {
"1|a",
)
if !reflect.DeepEqual(results, wantResults) {
t.Errorf("mergeSort:\n%s, want\n%s", sqltypes.PrintResults(results), sqltypes.PrintResults(wantResults))
t.Errorf("MergeSort:\n%s, want\n%s", sqltypes.PrintResults(results), sqltypes.PrintResults(wantResults))
}
}
@ -194,7 +194,7 @@ func TestMergeSortEmptyResults(t *testing.T) {
bvs := []map[string]*querypb.BindVariable{nil, nil, nil, nil}
var results []*sqltypes.Result
err := mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error {
err := MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error {
results = append(results, qr)
return nil
})
@ -213,7 +213,7 @@ func TestMergeSortEmptyResults(t *testing.T) {
"7|g",
)
if !reflect.DeepEqual(results, wantResults) {
t.Errorf("mergeSort:\n%s, want\n%s", sqltypes.PrintResults(results), sqltypes.PrintResults(wantResults))
t.Errorf("MergeSort:\n%s, want\n%s", sqltypes.PrintResults(results), sqltypes.PrintResults(wantResults))
}
}
@ -235,10 +235,10 @@ func TestMergeSortResultFailures(t *testing.T) {
vc.shardResults["0"] = &shardResult{
sendErr: errors.New("early error"),
}
err := mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
err := MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
want := "early error"
if err == nil || err.Error() != want {
t.Errorf("mergeSort(): %v, want %v", err, want)
t.Errorf("MergeSort(): %v, want %v", err, want)
}
// Test fail after fields.
@ -247,10 +247,10 @@ func TestMergeSortResultFailures(t *testing.T) {
results: sqltypes.MakeTestStreamingResults(idFields),
sendErr: errors.New("fail after fields"),
}
err = mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
err = MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
want = "fail after fields"
if err == nil || err.Error() != want {
t.Errorf("mergeSort(): %v, want %v", err, want)
t.Errorf("MergeSort(): %v, want %v", err, want)
}
// Test fail after first row.
@ -258,10 +258,10 @@ func TestMergeSortResultFailures(t *testing.T) {
results: sqltypes.MakeTestStreamingResults(idFields, "1"),
sendErr: errors.New("fail after first row"),
}
err = mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
err = MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
want = "fail after first row"
if err == nil || err.Error() != want {
t.Errorf("mergeSort(): %v, want %v", err, want)
t.Errorf("MergeSort(): %v, want %v", err, want)
}
}
@ -288,13 +288,13 @@ func TestMergeSortDataFailures(t *testing.T) {
}
bvs := []map[string]*querypb.BindVariable{nil, nil}
err := mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
err := MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
want := `strconv.ParseInt: parsing "2.1": invalid syntax`
if err == nil || err.Error() != want {
t.Errorf("mergeSort(): %v, want %v", err, want)
t.Errorf("MergeSort(): %v, want %v", err, want)
}
// Create a new VCursor because the previous mergeSort will still
// Create a new VCursor because the previous MergeSort will still
// have lingering goroutines that can cause data race.
vc = &streamVCursor{
shardResults: map[string]*shardResult{
@ -307,10 +307,10 @@ func TestMergeSortDataFailures(t *testing.T) {
)},
},
}
err = mergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
err = MergeSort(vc, "", orderBy, rss, bvs, func(qr *sqltypes.Result) error { return nil })
want = `strconv.ParseInt: parsing "1.1": invalid syntax`
if err == nil || err.Error() != want {
t.Errorf("mergeSort(): %v, want %v", err, want)
t.Errorf("MergeSort(): %v, want %v", err, want)
}
}

Просмотреть файл

@ -331,7 +331,7 @@ func (route *Route) StreamExecute(vcursor VCursor, bindVars map[string]*querypb.
})
}
return mergeSort(vcursor, route.Query, route.OrderBy, rss, bvs, func(qr *sqltypes.Result) error {
return MergeSort(vcursor, route.Query, route.OrderBy, rss, bvs, func(qr *sqltypes.Result) error {
return callback(qr.Truncate(route.TruncateColumnCount))
})
}

Просмотреть файл

@ -30,10 +30,9 @@ import (
// uvindex is Unique.
type uvindex struct{ matchid, matchkr bool }
func (*uvindex) String() string { return "uvindex" }
func (*uvindex) Cost() int { return 1 }
func (*uvindex) IsUnique() bool { return true }
func (*uvindex) IsFunctional() bool { return false }
func (*uvindex) String() string { return "uvindex" }
func (*uvindex) Cost() int { return 1 }
func (*uvindex) IsUnique() bool { return true }
func (*uvindex) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
panic("unimplemented")
}
@ -60,10 +59,9 @@ func (v *uvindex) Map(cursor vindexes.VCursor, ids []sqltypes.Value) ([]key.Dest
// nvindex is NonUnique.
type nvindex struct{ matchid, matchkr bool }
func (*nvindex) String() string { return "nvindex" }
func (*nvindex) Cost() int { return 1 }
func (*nvindex) IsUnique() bool { return false }
func (*nvindex) IsFunctional() bool { return false }
func (*nvindex) String() string { return "nvindex" }
func (*nvindex) Cost() int { return 1 }
func (*nvindex) IsUnique() bool { return false }
func (*nvindex) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
panic("unimplemented")
}

Просмотреть файл

@ -654,7 +654,7 @@ func TestInsertShardedKeyrange(t *testing.T) {
// If a unique vindex returns a keyrange, we fail the insert
_, err := executorExec(executor, "insert into keyrange_table(krcol_unique, krcol) values(1, 1)", nil)
want := "execInsertSharded: getInsertShardedRoute: could not map INT64(1) to a unique keyspace id: DestinationKeyRange(-10)"
want := "execInsertSharded: getInsertShardedRoute: could not map [INT64(1)] to a unique keyspace id: DestinationKeyRange(-10)"
if err == nil || err.Error() != want {
t.Errorf("executorExec error: %v, want %s", err, want)
}
@ -786,13 +786,9 @@ func TestInsertShardedIgnore(t *testing.T) {
Sql: "insert ignore into insert_ignore_test(pv, owned, verify) values (:_pv0, :_owned0, :_verify0),(:_pv4, :_owned4, :_verify4) /* vtgate:: keyspace_id:166b40b44aba4bd6,166b40b44aba4bd6 */",
BindVariables: map[string]*querypb.BindVariable{
"_pv0": sqltypes.Int64BindVariable(1),
"_pv2": sqltypes.Int64BindVariable(3),
"_pv3": sqltypes.Int64BindVariable(4),
"_pv4": sqltypes.Int64BindVariable(5),
"_pv5": sqltypes.Int64BindVariable(6),
"_owned0": sqltypes.Int64BindVariable(1),
"_owned2": sqltypes.Int64BindVariable(3),
"_owned3": sqltypes.Int64BindVariable(4),
"_owned4": sqltypes.Int64BindVariable(5),
"_owned5": sqltypes.Int64BindVariable(6),
"_verify0": sqltypes.Int64BindVariable(1),
@ -807,13 +803,9 @@ func TestInsertShardedIgnore(t *testing.T) {
Sql: "insert ignore into insert_ignore_test(pv, owned, verify) values (:_pv5, :_owned5, :_verify5) /* vtgate:: keyspace_id:4eb190c9a2fa169c */",
BindVariables: map[string]*querypb.BindVariable{
"_pv0": sqltypes.Int64BindVariable(1),
"_pv2": sqltypes.Int64BindVariable(3),
"_pv3": sqltypes.Int64BindVariable(4),
"_pv4": sqltypes.Int64BindVariable(5),
"_pv5": sqltypes.Int64BindVariable(6),
"_owned0": sqltypes.Int64BindVariable(1),
"_owned2": sqltypes.Int64BindVariable(3),
"_owned3": sqltypes.Int64BindVariable(4),
"_owned4": sqltypes.Int64BindVariable(5),
"_owned5": sqltypes.Int64BindVariable(6),
"_verify0": sqltypes.Int64BindVariable(1),

Просмотреть файл

@ -282,10 +282,9 @@ func (dp DestinationAnyShardPickerFirstShard) PickShard(shardCount int) int {
type keyRangeLookuper struct {
}
func (v *keyRangeLookuper) String() string { return "keyrange_lookuper" }
func (*keyRangeLookuper) Cost() int { return 0 }
func (*keyRangeLookuper) IsUnique() bool { return false }
func (*keyRangeLookuper) IsFunctional() bool { return false }
func (v *keyRangeLookuper) String() string { return "keyrange_lookuper" }
func (*keyRangeLookuper) Cost() int { return 0 }
func (*keyRangeLookuper) IsUnique() bool { return false }
func (*keyRangeLookuper) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
return []bool{}, nil
}
@ -307,10 +306,9 @@ func newKeyRangeLookuper(name string, params map[string]string) (vindexes.Vindex
type keyRangeLookuperUnique struct {
}
func (v *keyRangeLookuperUnique) String() string { return "keyrange_lookuper" }
func (*keyRangeLookuperUnique) Cost() int { return 0 }
func (*keyRangeLookuperUnique) IsUnique() bool { return true }
func (*keyRangeLookuperUnique) IsFunctional() bool { return false }
func (v *keyRangeLookuperUnique) String() string { return "keyrange_lookuper" }
func (*keyRangeLookuperUnique) Cost() int { return 0 }
func (*keyRangeLookuperUnique) IsUnique() bool { return true }
func (*keyRangeLookuperUnique) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
return []bool{}, nil
}

Просмотреть файл

@ -39,10 +39,9 @@ import (
// hashIndex is a functional, unique Vindex.
type hashIndex struct{ name string }
func (v *hashIndex) String() string { return v.name }
func (*hashIndex) Cost() int { return 1 }
func (*hashIndex) IsUnique() bool { return true }
func (*hashIndex) IsFunctional() bool { return true }
func (v *hashIndex) String() string { return v.name }
func (*hashIndex) Cost() int { return 1 }
func (*hashIndex) IsUnique() bool { return true }
func (*hashIndex) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
return []bool{}, nil
}
@ -57,10 +56,9 @@ func newHashIndex(name string, _ map[string]string) (vindexes.Vindex, error) {
// lookupIndex is a unique Vindex, and satisfies Lookup.
type lookupIndex struct{ name string }
func (v *lookupIndex) String() string { return v.name }
func (*lookupIndex) Cost() int { return 2 }
func (*lookupIndex) IsUnique() bool { return true }
func (*lookupIndex) IsFunctional() bool { return false }
func (v *lookupIndex) String() string { return v.name }
func (*lookupIndex) Cost() int { return 2 }
func (*lookupIndex) IsUnique() bool { return true }
func (*lookupIndex) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
return []bool{}, nil
}
@ -82,10 +80,9 @@ var _ vindexes.Lookup = (*lookupIndex)(nil)
// multiIndex satisfies Lookup, NonUnique.
type multiIndex struct{ name string }
func (v *multiIndex) String() string { return v.name }
func (*multiIndex) Cost() int { return 3 }
func (*multiIndex) IsUnique() bool { return false }
func (*multiIndex) IsFunctional() bool { return false }
func (v *multiIndex) String() string { return v.name }
func (*multiIndex) Cost() int { return 3 }
func (*multiIndex) IsUnique() bool { return false }
func (*multiIndex) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
return []bool{}, nil
}
@ -108,10 +105,9 @@ var _ vindexes.Lookup = (*multiIndex)(nil)
// costlyIndex satisfies Lookup, NonUnique.
type costlyIndex struct{ name string }
func (v *costlyIndex) String() string { return v.name }
func (*costlyIndex) Cost() int { return 10 }
func (*costlyIndex) IsUnique() bool { return false }
func (*costlyIndex) IsFunctional() bool { return false }
func (v *costlyIndex) String() string { return v.name }
func (*costlyIndex) Cost() int { return 10 }
func (*costlyIndex) IsUnique() bool { return false }
func (*costlyIndex) Verify(vindexes.VCursor, []sqltypes.Value, [][]byte) ([]bool, error) {
return []bool{}, nil
}

Просмотреть файл

@ -69,8 +69,7 @@ var (
)
// vtgateHandler implements the Listener interface.
// It stores the Session in the ClientData of a Connection, if a transaction
// is in progress.
// It stores the Session in the ClientData of a Connection.
type vtgateHandler struct {
vtg *VTGate
}
@ -86,15 +85,13 @@ func (vh *vtgateHandler) NewConnection(c *mysql.Conn) {
func (vh *vtgateHandler) ComResetConnection(c *mysql.Conn) {
ctx := context.Background()
session, _ := c.ClientData.(*vtgatepb.Session)
if session != nil {
if session.InTransaction {
defer atomic.AddInt32(&busyConnections, -1)
}
_, _, err := vh.vtg.Execute(ctx, session, "rollback", make(map[string]*querypb.BindVariable))
if err != nil {
log.Errorf("Error happened in transaction rollback: %v", err)
}
session := vh.session(c)
if session.InTransaction {
defer atomic.AddInt32(&busyConnections, -1)
}
_, _, err := vh.vtg.Execute(ctx, session, "rollback", make(map[string]*querypb.BindVariable))
if err != nil {
log.Errorf("Error happened in transaction rollback: %v", err)
}
}
@ -108,13 +105,11 @@ func (vh *vtgateHandler) ConnectionClosed(c *mysql.Conn) {
} else {
ctx = context.Background()
}
session, _ := c.ClientData.(*vtgatepb.Session)
if session != nil {
if session.InTransaction {
defer atomic.AddInt32(&busyConnections, -1)
}
_, _, _ = vh.vtg.Execute(ctx, session, "rollback", make(map[string]*querypb.BindVariable))
session := vh.session(c)
if session.InTransaction {
defer atomic.AddInt32(&busyConnections, -1)
}
_, _, _ = vh.vtg.Execute(ctx, session, "rollback", make(map[string]*querypb.BindVariable))
}
// Regexp to extract parent span id over the sql query
@ -146,6 +141,10 @@ func startSpan(ctx context.Context, query, label string) (trace.Span, context.Co
return startSpanTestable(ctx, query, label, trace.NewSpan, trace.NewFromString)
}
func (vh *vtgateHandler) ComInitDB(c *mysql.Conn, schemaName string) {
vh.session(c).TargetString = schemaName
}
func (vh *vtgateHandler) ComQuery(c *mysql.Conn, query string, callback func(*sqltypes.Result) error) error {
ctx := context.Background()
var cancel context.CancelFunc
@ -174,19 +173,7 @@ func (vh *vtgateHandler) ComQuery(c *mysql.Conn, query string, callback func(*sq
"VTGate MySQL Connector" /* subcomponent: part of the client */)
ctx = callerid.NewContext(ctx, ef, im)
session, _ := c.ClientData.(*vtgatepb.Session)
if session == nil {
session = &vtgatepb.Session{
Options: &querypb.ExecuteOptions{
IncludedFields: querypb.ExecuteOptions_ALL,
},
Autocommit: true,
}
if c.Capabilities&mysql.CapabilityClientFoundRows != 0 {
session.Options.ClientFoundRows = true
}
}
session := vh.session(c)
if !session.InTransaction {
atomic.AddInt32(&busyConnections, 1)
}
@ -196,15 +183,11 @@ func (vh *vtgateHandler) ComQuery(c *mysql.Conn, query string, callback func(*sq
}
}()
if session.TargetString == "" && c.SchemaName != "" {
session.TargetString = c.SchemaName
}
if session.Options.Workload == querypb.ExecuteOptions_OLAP {
err := vh.vtg.StreamExecute(ctx, session, query, make(map[string]*querypb.BindVariable), callback)
return mysql.NewSQLErrorFromError(err)
}
session, result, err := vh.vtg.Execute(ctx, session, query, make(map[string]*querypb.BindVariable))
c.ClientData = session
err = mysql.NewSQLErrorFromError(err)
if err != nil {
return err
@ -237,19 +220,7 @@ func (vh *vtgateHandler) ComPrepare(c *mysql.Conn, query string) ([]*querypb.Fie
"VTGate MySQL Connector" /* subcomponent: part of the client */)
ctx = callerid.NewContext(ctx, ef, im)
session, _ := c.ClientData.(*vtgatepb.Session)
if session == nil {
session = &vtgatepb.Session{
Options: &querypb.ExecuteOptions{
IncludedFields: querypb.ExecuteOptions_ALL,
},
Autocommit: true,
}
if c.Capabilities&mysql.CapabilityClientFoundRows != 0 {
session.Options.ClientFoundRows = true
}
}
session := vh.session(c)
if !session.InTransaction {
atomic.AddInt32(&busyConnections, 1)
}
@ -259,12 +230,7 @@ func (vh *vtgateHandler) ComPrepare(c *mysql.Conn, query string) ([]*querypb.Fie
}
}()
if session.TargetString == "" && c.SchemaName != "" {
session.TargetString = c.SchemaName
}
session, fld, err := vh.vtg.Prepare(ctx, session, query, make(map[string]*querypb.BindVariable))
c.ClientData = session
err = mysql.NewSQLErrorFromError(err)
if err != nil {
return nil, err
@ -296,19 +262,7 @@ func (vh *vtgateHandler) ComStmtExecute(c *mysql.Conn, prepare *mysql.PrepareDat
"VTGate MySQL Connector" /* subcomponent: part of the client */)
ctx = callerid.NewContext(ctx, ef, im)
session, _ := c.ClientData.(*vtgatepb.Session)
if session == nil {
session = &vtgatepb.Session{
Options: &querypb.ExecuteOptions{
IncludedFields: querypb.ExecuteOptions_ALL,
},
Autocommit: true,
}
if c.Capabilities&mysql.CapabilityClientFoundRows != 0 {
session.Options.ClientFoundRows = true
}
}
session := vh.session(c)
if !session.InTransaction {
atomic.AddInt32(&busyConnections, 1)
}
@ -318,9 +272,6 @@ func (vh *vtgateHandler) ComStmtExecute(c *mysql.Conn, prepare *mysql.PrepareDat
}
}()
if session.TargetString == "" && c.SchemaName != "" {
session.TargetString = c.SchemaName
}
if session.Options.Workload == querypb.ExecuteOptions_OLAP {
err := vh.vtg.StreamExecute(ctx, session, prepare.PrepareStmt, prepare.BindVars, callback)
return mysql.NewSQLErrorFromError(err)
@ -335,11 +286,24 @@ func (vh *vtgateHandler) ComStmtExecute(c *mysql.Conn, prepare *mysql.PrepareDat
}
func (vh *vtgateHandler) WarningCount(c *mysql.Conn) uint16 {
return uint16(len(vh.session(c).GetWarnings()))
}
func (vh *vtgateHandler) session(c *mysql.Conn) *vtgatepb.Session {
session, _ := c.ClientData.(*vtgatepb.Session)
if session != nil {
return uint16(len(session.GetWarnings()))
if session == nil {
session = &vtgatepb.Session{
Options: &querypb.ExecuteOptions{
IncludedFields: querypb.ExecuteOptions_ALL,
},
Autocommit: true,
}
if c.Capabilities&mysql.CapabilityClientFoundRows != 0 {
session.Options.ClientFoundRows = true
}
c.ClientData = session
}
return 0
return session
}
var mysqlListener *mysql.Listener

Просмотреть файл

@ -43,6 +43,9 @@ func (th *testHandler) NewConnection(c *mysql.Conn) {
func (th *testHandler) ConnectionClosed(c *mysql.Conn) {
}
func (th *testHandler) ComInitDB(c *mysql.Conn, schemaName string) {
}
func (th *testHandler) ComQuery(c *mysql.Conn, q string, callback func(*sqltypes.Result) error) error {
return nil
}
@ -52,7 +55,6 @@ func (th *testHandler) ComPrepare(c *mysql.Conn, q string) ([]*querypb.Field, er
}
func (th *testHandler) ComResetConnection(c *mysql.Conn) {
}
func (th *testHandler) ComStmtExecute(c *mysql.Conn, prepare *mysql.PrepareData, callback func(*sqltypes.Result) error) error {

Просмотреть файл

@ -54,11 +54,6 @@ func (vind *Binary) IsUnique() bool {
return true
}
// IsFunctional returns true since the Vindex is functional.
func (vind *Binary) IsFunctional() bool {
return true
}
// Verify returns true if ids maps to ksids.
func (vind *Binary) Verify(_ VCursor, ids []sqltypes.Value, ksids [][]byte) ([]bool, error) {
out := make([]bool, len(ids))

Просмотреть файл

@ -53,11 +53,6 @@ func (vind *BinaryMD5) IsUnique() bool {
return true
}
// IsFunctional returns true since the Vindex is functional.
func (vind *BinaryMD5) IsFunctional() bool {
return true
}
// Verify returns true if ids maps to ksids.
func (vind *BinaryMD5) Verify(_ VCursor, ids []sqltypes.Value, ksids [][]byte) ([]bool, error) {
out := make([]bool, len(ids))

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше