зеркало из https://github.com/github/vitess-gh.git
Merge remote-tracking branch 'upstream/master' into cluster_for_test
Signed-off-by: Morgan Tocker <tocker@gmail.com>
This commit is contained in:
Коммит
e79b8451a9
|
@ -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"
|
|
@ -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
|
||||
|
2
Makefile
2
Makefile
|
@ -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.
|
||||
|
|
23
bootstrap.sh
23
bootstrap.sh
|
@ -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
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
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))
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче